1.概念:
以对客户透明的方式来扩展对象的功能,用户根据功能需求随意选取组成对象的成分进行动态地将责任附加到对象上,通过方法的链式调用来实现
装饰者提供了比继承更有弹性的替代方案, 简单来讲就是动态的给一个对象增加一些职能,相对与生成子类更加灵活
设计原则为:开闭原则(类应该对扩展开发,对修改关闭)
2.应用以及说明:
1装饰模式增加强了单个对象的能力。Java IO到处都使用了装饰模式,经典的例子就是Buffered系列类如BufferedReader和BufferedWriter,它们增强了Reader和Writer对象,以实现提升性能的Buffer层次的读取和写入。
2该模式中装饰者和被装饰者都继承同一个父类,这里继承的目的是为了达到”类型匹配“,而不是获得父类的”行为“ 摘自(HeadFirst设计模式)
3组合和委托可用于运行时动态地加上新的行为
4装饰者可以在被装饰者的行为前面 与/或后面加上自己的行为,甚至可以将被装饰者的行为整个取代掉,从而达到某种目的
5装饰者会导致设计中出现很多小对象,如果过度使用,会成程序变得很复杂
3. 类图
4. 代码示例
public interface Work {
void doWork();
}
public class CommonWork implements Work {
@Override
public void doWork() {
System.out.println("早安,打工人!");
}
}
public class DoctorWork implements Work {
private CommonWork commonWork;
public DoctorWork(CommonWork commonWork) {
this.commonWork = commonWork;
}
@Override
public void doWork() {
commonWork.doWork();
System.out.println("我的工作就是救死扶伤");
}
}
public class PoliceWorker implements Work {
private CommonWork commonWork;
public PoliceWorker(CommonWork commonWork) {
this.commonWork = commonWork;
}
@Override
public void doWork() {
commonWork.doWork();
System.out.println("我的工作就是保卫大家的安全");
}
}
public class TeacherWork implements Work {
private CommonWork commonWork;
public TeacherWork(CommonWork commonWork) {
this.commonWork = commonWork;
}
@Override
public void doWork() {
commonWork.doWork();
System.out.println("我的工作就是培养祖国的花朵");
}
}
public class WorkTest {
public static void main(String[] args) {
CommonWork commonWork = new CommonWork();
DoctorWork doctorWork = new DoctorWork(commonWork);
doctorWork.doWork();
PoliceWorker policeWorker=new PoliceWorker(commonWork);
policeWorker.doWork();
TeacherWork teacherWork=new TeacherWork(commonWork);
teacherWork.doWork();
}
}