装饰者模式

    xiaoxiao2021-03-25  68

    装饰者模式 1、意图: 动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。 2、适用环境 (1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 (2)处理那些可以撤消的职责。 (3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。 3、参与者     1.Component(被装饰对象的基类)       定义一个对象接口,可以给这些对象动态地添加职责。     2.ConcreteComponent(具体被装饰对象)       定义一个对象,可以给这个对象添加一些职责。     3.Decorator(装饰者抽象类)       维持一个指向Component实例的引用,并定义一个与Component接口一致的接口。     4.ConcreteDecorator(具体装饰者)

          具体的装饰对象,给内部持有的具体被装饰对象,增加具体的职责。

        5.类图:

     

    6 具体实现

    abstractcomponent类:

    phone.java

    package com.heima.decorate; public interface Phone { public void call(); public void attribute(); }abstractDecorator类:

    AbstractDecorator.java

    package com.heima.decorate; public abstract class AbstractDecotator implements Phone { private Phone phone; public void setPhone(Phone phone) { this.phone = phone; } public void call() { phone.call(); } public void attribute() { phone.attribute(); } } component类

    Iphone.java

    package com.heima.decorate; public class Iphone implements Phone { public void attribute() { System.out.println("美国产"); } public void call() { System.out.println("用iphone打电话"); } } Decorator类:

    RealDecorator.java

    package com.heima.decorate; public class RealDecorate extends AbstractDecotator { @Override public void call() { super.call(); recall(); System.out.println("这是RealDecorateA"); } public static void recall(){ System.out.println("打长途电话"); } } test类:

    package com.heima.decorate; public class TestDecorate { /** * @param args */ public static void main(String[] args) { Iphone ip=new Iphone(); RealDecorate rd=new RealDecorate(); rd.setPhone(ip); rd.call(); } } 打印结果:

    用iphone打电话 打长途电话 这是RealDecorateA

    转载自:http://www.cnblogs.com/chenxing818/p/4705919.html

    转载请注明原文地址: https://ju.6miu.com/read-32600.html

    最新回复(0)