Decorator装饰模式是一种结构型模式,它主要是解决:“过度地使用了继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀(多继承)。继承为类型引入的静态特质的意思是说以继承的方式使某一类型要获得功能是在编译时。所谓静态,是指在编译时;动态,是指在运行时。
GoF《设计模式》中说道:动态的给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类更为灵活。
下面来看看Decorator模式的结构:
看这个结构好像不是很明白,下面我根据代码讲解一下这个结构。我想了一个场景:我们现在用的手机功能很多,我就用Decorator模式实现一下对某个手机的GSP和蓝牙功能扩展。
首先,我们需要一个手机的接口或者是抽象类,我这里就用抽象类来实现,代码如下:
package decorator_phone;
public abstract class AbstractCellPhone {
public abstract String CallNumber();
public abstract String SendMessage();
}
AbstractCellPhone也就是结构图中的Component,然后,我再来实现Nokia和Moto的手机类,这类要继承AbstractCellPhone,也就是图中ConcreteComponent类要继承Component,实现代码如下:
package decorator_phone;
public class NokiaPhone extends AbstractCellPhone {
public String CallNumber() {
return "NokiaPhone call sombody";
}
public String SendMessage() {
return "NokiaPhone send a message to somebody";
}
}
package decorator_phone;
public class MotoPhone extends AbstractCellPhone {
public String CallNumber() {
return "MotoPhone call sombody";
}
public String SendMessage() {
return "MotoPhone send a message to somebody";
}
}
接下来我需要一个Decorator接口或者抽象类,实现代码如下: