综述:装饰模式,它的意图是动态的给对象添加一些额外的职责,该模式以对客户端透明的方式扩展对象的功能。使用装饰模式代替子类的原因:当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
装饰模式实例
1、先看一张类图
2、对上面类图的四大部分解释:
2.1、interface Component,是被装饰对象,定义成接口来动态的添加职责。
2.2、class ContreteComponent,是具体的实现了Component接口的类,也就是具体需要被装饰的类。
2.3、Decorate,总的抽象装饰类,设置为抽象类更合适,此类也实现了Component接口,很好理解,是为了在原来功能的基础之上添加新的功能,否则也就不是装饰模式了。
2.4、设计具体的Decorate子类增强功能,各个子类之间互不冲突。
3、装饰模式具体示例
接口类
public interface StudentComponent {
public void study();
}
接口实现类
public class ConcreteComponent implements StudentComponent{
@Override
public void study() {
System.out.println("学习");
}
}
抽象装饰类
public class AbstractDecorate implements StudentComponent{
private StudentComponent studentComponent;
public void setStudentComponent(StudentComponent studentComponent) {
this.studentComponent = studentComponent;
}
@Override
public void study() {
studentComponent.study();
}
}
具体装饰类
public class ContreteDecorate_1 extends AbstractDecorate{
@Override
public void study(){
super.study();
dance();
}
public void dance(){
System.out.println("我还会跳舞");
}
}
测试
public class Test {
public static void main(String[] args) {
StudentComponent studentComponent = new ConcreteComponent();
ContreteDecorate_1 contreteDecorate = new ContreteDecorate_1();
contreteDecorate.setStudentComponent(studentComponent);
contreteDecorate.study();
}
/**
* 学习
* 我还会跳舞
*/
}
上面只显示了了一种装饰,可以扩展很多装饰类。
总结:装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象,也就是装饰来包裹真正的对象。其实装饰模式就类似于切面编程,A extends B,B extends C,那么对B的操作会影响到其子类,这是如果不适用装饰模式,为了加强B类功能,可以设计子类,但是如果功能增加子类会有很多,显得很臃肿,这不是我们想要的;使用装饰模式之后我们就可以再不改变原有类的继承关系的基础上装饰B类,在需要被装饰类的地方我们就可以直接使用装饰类代替被装饰类来增强功能。