我眼中的装饰器模式

装饰器模式,简称装饰模式。关键在于装饰二字

什么情况下用到装饰模式

对核心类进行功能的扩充。分清主次,一个是核心功能的类,一个的附加功能的类。从职责的角度来讲,就是把主要的功能和次要的功能隔离开,次要的功能放到装饰类。

个人感觉还有一个特点,多种装饰类是可以叠加的。就像生活中,给自己的心爱的房子家加上了灯泡的装饰,也还可以贴墙纸,挂画等装饰。

装饰模式的类图

为了实现装饰的功能。类图中主要表达两个意思:

1.装饰类与核心类具有完全一样的功能。为了达到这点,需要与核心类实现一样的接口。或者直接继承于核心类。

2.对核心类进行扩展。为了达到这一点,需要装饰类能够持有核心类的实例。为了达到这一点,需要装饰类能够持有核心类的实例。这里有一个问题,如果是单纯的继承也可以实现这种功能的扩展吗?答案是不可以,单纯的继承如果要形成嵌套的链式关系(一个核心有多个装饰)就需要一个很长的继承关系,这样是不友好的,违反来组合复用原则。

类图1:假设核心类的主要功能都是有接口约束的

装饰类图1

类图2: 如果核心类本身没有任何的继承和实现接口的关系,也可进行装饰,如下图所示:

装饰类图2

装饰模式的代码实现

本代码是针对类图2来进行解释

//核心类

public class Core {

    //这个是一个核心类,包含主要的功能.我是稳定的
    public String getName() {
        return "I am core";
    }
}

//装饰类A
public class CoreDecorateA extends Core{

    private Core core;

    public CoreDecorateA(Core core) {
        // TODO Auto-generated constructor stub
        this.core = core;
    }

    @Override
    public String getName() {
        return "I am CoreDecorateA decorate < "+core.getName()+" >";
    }

}
//装饰类B
public class CoreDecorateB extends Core {

  private Core core;

    public CoreDecorateB(Core core) {
        // TODO Auto-generated constructor stub
        this.core = core;
    }

    @Override
    public String getName() {
        return "I am CoreDecorateB decorate < "+core.getName()+" >";
    }
}
//调用
        Core core = new Core();
        CoreDecorateA coreDecorateA = new CoreDecorateA(core);
        CoreDecorateB coreDecorateB = new CoreDecorateB(coreDecorateA);

        //装饰类 A 和 B 是无关紧要的一些附加功能.核心core类并不知道这些装饰类的存在.
        //A包装 core, B包装 A,形成了一个装饰链.
        Log.d(coreDecorateB.getName());


        //可以自由的更改装饰链的顺序
        coreDecorateB = new CoreDecorateB(core);
        coreDecorateA = new CoreDecorateA(coreDecorateB);

        Log.d(coreDecorateA.getName());

为了更好的查看,以代码的方式进行了记录.详情请查看DesignPattern中的 com.arron.pattern.decorate下的内容.戳我查看详情

猜你喜欢

转载自blog.csdn.net/xjz729827161/article/details/78142173