Java设计模式之装饰者模式
- 定义
装饰模式(Decorator)又名包装(Wrapper)模式,装饰模式以对客户端(执行功能的类)透明的方式扩展对象的功能,是继承关系的一个替代方案;
装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任(比如描述、功能)。换言之客户端并不会觉的对象在装饰前和装饰后有什么区别。
- 特点
- 装饰对象和真实对象具有相同的接口,这样客户端对象就可以以真实对象的相同的方式和装饰对象交互。
2)装饰对象包含一个真实对象的引用(reference).
3)装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。
4)装饰对象可以在转发这些请求以前或者以后增加一些附加的功能。这样就能确保在运行时,不用修改给定对象结构就可以在外部增加附加的功能。在面向对象的程序设计中,通常是使用继承的关系来扩展给定类的功能。
装饰模式可以在不创造更多的子类的模式下,将对象的功能加以扩展,降低了代码的耦合度。
- 举例
抽象构建角色由Programmer程序员接口扮演
具体构件角色由类汤高扮演 他实现了程序员具有的功能
装饰构件由 类Derector扮演 它必须也实现抽象构件接口
具体装饰构件角色由 类Hacker(黑客) 和类 SoftwareAchitect(架构师)扮演
具体程序员汤高有编程能力,上帝可以给他赋予更多能力 每赋予一种能力,他就多一个技能 这是通过装饰构件实现的抽象构件角色
类图:
代码实现如下:
扩展的功能
/**
* 客户端,最终实现类
*/
public class Client {
public static void main(String[] args) {
//创建构件对象 汤高 ->他是一个具体的程序员
//但是现在他只有编程能力 那怎么行
//必须赋予他更大的能力 不然怎么赚大钱!
//所以 上帝给他装饰了一番 瞬间提神了他的B格
Programmer programmer=new 汤高();
//装饰类登场 屌丝 我来装饰你 让你具有更大的能力
Derector hacker=new Hacker(programmer);
//这下汤高这个屌丝程序员就具有黑客的技能包了
//这下就没有谁敢叫他屌丝了吧 哈哈 不然分分钟让你电脑崩溃
System.out.println("第一次装饰");
hacker.programmer();
//程序员还不满足 他还要更多的技能 因为他要逆袭
//所以上帝再给他装饰了一下
//在他具有黑客技能的基础上另外赋予了他架构师的功能
System.out.println("--------------第二次装饰");
Derector achitect=new SoftwareArchitect(hacker);
achitect.programmer();
//也可以一步装饰两个技能 因为他们有共同的父类抽象构件接口 Programmer
System.out.println("------------一步装饰两个技能");
Derector achitect1=new SoftwareArchitect( new Hacker(new 汤高() ) );
achitect1.programmer();
}
}