java设计模式大话之装饰者模式
2017-01-19 17:47
232 查看
去年有一部很火的电视剧叫《伪装者》,胡歌、靳东、刘敏涛、王凯领衔主演,收视跟口碑都不错。没看过的小伙伴们可以去看下。
![](https://img-blog.csdn.net/20170119160147705?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdnNkZHZzZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
跑题了,聊聊正题装饰着模式:
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,是不是有点伪装者的味道。
注意几点:
(1)装饰对象和真实对象有相同接口,这样客户端在用的时候就可以把装饰对象当成真实对象来用,这是实现的关键
(2)装饰者包含一个真实对象的实例的引用。
(3)装饰对象接收所有来自客户端的请求,并把这些请求转发给真实的对象。
(4)装饰者可以在转发这些请求之前或者之后添加一些附加功能,这样就可以在不修改给定对象的结构情况下,附加功能,一般在设计的时候我们都是通过继承来扩展功能,而这种模式不需要子类就能扩展,更加灵活,方便。
类图:
![](https://img-blog.csdn.net/20170119162724540?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdnNkZHZzZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
具体实例:
小张的女朋友要过生日了,为了给她一个惊喜,小张特地偷学了做蛋糕的手艺,想自己做一个既美味又漂亮的蛋糕给女朋友,这不他买来了蛋糕面包,奶油,水果,还有一些别的小装饰品准备大干一场了。
![](https://img-blog.csdn.net/20170119174509097?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdnNkZHZzZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
总结:
(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
(2)处理那些可以撤消的职责。
(3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
跑题了,聊聊正题装饰着模式:
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,是不是有点伪装者的味道。
注意几点:
(1)装饰对象和真实对象有相同接口,这样客户端在用的时候就可以把装饰对象当成真实对象来用,这是实现的关键
(2)装饰者包含一个真实对象的实例的引用。
(3)装饰对象接收所有来自客户端的请求,并把这些请求转发给真实的对象。
(4)装饰者可以在转发这些请求之前或者之后添加一些附加功能,这样就可以在不修改给定对象的结构情况下,附加功能,一般在设计的时候我们都是通过继承来扩展功能,而这种模式不需要子类就能扩展,更加灵活,方便。
类图:
具体实例:
小张的女朋友要过生日了,为了给她一个惊喜,小张特地偷学了做蛋糕的手艺,想自己做一个既美味又漂亮的蛋糕给女朋友,这不他买来了蛋糕面包,奶油,水果,还有一些别的小装饰品准备大干一场了。
public interface ICake { //准备材料 public void prepair(); //塑形制做 public void make(); } //普通的奶油蛋糕 public class NormalCake implements ICake { //准备材料 public void prepair(){ System.out.println("正在准备原材料。。。"); }; //塑形制做 public void make(){ //prepair(); System.out.println("普通奶油蛋糕就快要出来了。。"); } } //小张是个追求浪漫的人,他看着自己做的简单的奶油蛋糕,一看不对,太普通了,一点惊喜都没有,还不如去外面直接买个蛋糕得了 ,所以他决定重新做一个巧克力水果蛋糕,并写上女友的名字 创建抽象装饰者: public abstract class AbstractCake implements ICake { private final ICake cake; public AbstractCake(ICake cake){ this.cake=cake; } //准备材料 public void prepair(){ this.cake.prepair(); }; //塑形制做 public void make() { } } 创建具体装饰者 public class Decorator extends AbstractCake{ public Decorator (ICake cake) { super(cake); } public void chocolate() { System.out.println("我开始给蛋糕涂上巧克力"); } public void fruit() { System.out.println("我开始给蛋糕放上水果"); } public void writeName() { System.out.println("我开始给蛋糕写名字"); } public void make() { super.prepair(); this.chocolate(); this.fruit(); this.writeName(); super.make(); } } 最终呈现 public class Client { public static void main(String args[]){ System.out.println("开始做蛋糕"); //先做一个普通的奶油蛋糕 ICake normalcake=new NormalCake(); //下面就开始进行装饰 normalcake=new Decorator(normalcake); normalcake.make(); System.out.println("蛋糕好了"); //装饰结束 } }运行结果:
总结:
(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
(2)处理那些可以撤消的职责。
(3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
相关文章推荐
- Head First Java 设计模式——装饰者模式
- java设计模式---装饰者模式(简单笔记)
- JAVA设计模式初探之装饰者模式
- 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法
- 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法
- java设计模式之装饰者模式
- java 设计模式 学习笔记(三)装饰者模式 推荐
- JAVA设计模式初探之装饰者模式
- Java 设计模式 装饰者模式
- Java设计模式菜鸟系列(三)装饰者模式建模与实现
- 【Java设计模式】装饰者模式
- JAVA系列-设计模式-装饰者模式
- JAVA设计模式——装饰者模式
- java设计模式之装饰者模式Decorator
- Java 装饰者设计模式
- Java设计模式之装饰者模式
- JAVA设计模式——装饰者模式
- java 设计模式中 装饰者模式 与 代理模式的区别
- java设计模式学习(三)装饰者模式(decorator)
- 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法