装饰器模式,简称装饰模式。关键在于装饰二字
什么情况下用到装饰模式
对核心类进行功能的扩充。分清主次,一个是核心功能的类,一个的附加功能的类。从职责的角度来讲,就是把主要的功能和次要的功能隔离开,次要的功能放到装饰类。
个人感觉还有一个特点,多种装饰类是可以叠加的。就像生活中,给自己的心爱的房子家加上了灯泡的装饰,也还可以贴墙纸,挂画等装饰。
装饰模式的类图
为了实现装饰的功能。类图中主要表达两个意思:
1.装饰类与核心类具有完全一样的功能。为了达到这点,需要与核心类实现一样的接口。或者直接继承于核心类。
2.对核心类进行扩展。为了达到这一点,需要装饰类能够持有核心类的实例。为了达到这一点,需要装饰类能够持有核心类的实例。这里有一个问题,如果是单纯的继承也可以实现这种功能的扩展吗?答案是不可以,单纯的继承如果要形成嵌套的链式关系(一个核心有多个装饰)就需要一个很长的继承关系,这样是不友好的,违反来组合复用原则。
类图1:假设核心类的主要功能都是有接口约束的
类图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下的内容.戳我查看详情