博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰模式
阅读量:6331 次
发布时间:2019-06-22

本文共 3778 字,大约阅读时间需要 12 分钟。

•装饰模式又名包装(Wrapper)模式

•装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案
•装饰模式以对客户透明的方式动态的给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。
•装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展。

•装饰模式又名包装(Wrapper)模式

•装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案

•装饰模式以对客户透明的方式动态的给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。
•装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展。

•装饰模式把客户端的调用委派到被装饰类。装饰模式的关键在于这种扩展完全是透明的。

•装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

 

•装饰模式的角色:

–抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。
–具体构件角色(Concrete Component):定义一个将要接收附加责任的类。
–装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口
–具体装饰角色(Concrete Decorator):负责给构件对象“贴上”附加的责任。

 

•装饰模式的特点:

–装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
–装饰对象包含一个真实对象的引用(reference)
–装饰对象接收所有来自客户端的请求。它把这些请求转发给真实的对象。
–装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

 

•装饰模式

–用来扩展特定对象的功能
–不需要子类
–动态
–运行时分配职责
–防止由于子类而导致的复杂和混乱
–更多的灵活性
–对于一个给定的对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象发送消息。

•继承

–用来扩展一类对象的功能
–需要子类
–静态
–编译时分派职责
–导致很多子类产生
–缺乏灵活性

Component.java

1 package cn.itcast.decorator;2 //抽象构件角色,给出一个抽象接口,以规范准备接受附加责任的对象.3 public interface Component{4     public void doSomething();5 }

ConcreteComponent.java

1 package cn.itcast.decorator;2 //具体构件角色(Concrete Component):定义一个将要接收附加责任的类。3 //相当于FileInputStream直接和输入源打交道的4 public class ConcreteComponent implements Component{5     @Override6     public void doSomething(){7         System.out.println("功能A");8     }9 }

Decorator.java

1 package cn.itcast.decorator; 2 //装饰角色,持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口. 3 //这个类对应于流中就是过滤流FilterInputStream. 4 public class Decorator implements Component{ 5     private Component component;//实现这个接口,并持有这个接口的引用. 6     //这个引用必须通过某种方式传递过来.这个地方用就定义一个构造方法. 7     //构构造方法中接受一个Component对象. 8     public Decorator(Component component){ 9         this.component = component;10     }11     12     @Override13     public void doSomething(){14         component.doSomething();15     }16 }

ConcreteDecorator1.java

1 package cn.itcast.decorator; 2 //具体装饰角色(Concrete Decorator):负责给构件对象“贴上”附加的责任。 3 //相当于IO中的BufferedInputStream. 4 public class ConcreteDecorator1 extends Decorator{ 5     public ConcreteDecorator1(Component component){ 6         super(component); 7     } 8      9     @Override10     public void doSomething(){11         super.doSomething();12         //让子类附加新的功能.13         this.doAnotherThing();14     }15     16     private void doAnotherThing(){17         System.out.println("功能B");18     }19 }

ConcreteDecorator2.java

1 package cn.itcast.decorator; 2 //具体装饰角色(Concrete Decorator):负责给构件对象“贴上”附加的责任。 3 public class ConcreteDecorator2 extends Decorator{ 4     public ConcreteDecorator2(Component component){ 5         super(component); 6     } 7     public void doSomething(){ 8         super.doSomething(); 9         //让子类附件新的功能.10         this.doAnotherThing();11     }12     private void doAnotherThing(){13         System.out.println("功能C");14     }15 }

Client.java

1 package cn.itcast.decorator; 2  3 public class Client{ 4     public static void main(String[] args){ 5         /* 6          * //节点流 Component component = new ConcreteComponent(); 7          *  8          * //过滤流 Component component2 = new ConcreteDecorator1(component); 9          * 10          * component2.doSomething();11          * 12          * System.out.println("------------");13          * 14          * //过滤流 Component component3 = new ConcreteDecorator2(component2);15          * 16          * component3.doSomething();17          */18 19         Component component = new ConcreteDecorator1(new ConcreteDecorator2(new ConcreteComponent()));20         //从最外层到最里层对应dataInputStream--->BufferInputStream---->FileInputStream21         component.doSomething();22     }23 }

 

本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4005296.html,如需转载请自行联系原作者

你可能感兴趣的文章
聚焦触宝反侵权事件:中国创业者用什么护航海外市场大门
查看>>
AOP技术基础
查看>>
Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析(2)
查看>>
Lync 小技巧-5-当前已暂停共享
查看>>
无线802.11n 2.4G与5G性能测试
查看>>
子域名信息收集攻略
查看>>
[Android]开发数独游戏思路分析过程
查看>>
SpreadJS 类Excel表格控件 - V12 新特性详解
查看>>
理解并取证:IPv6与IPv4在报文结构上的区别
查看>>
EOS主网上线只是开始,如何运营决定未来
查看>>
不用Visual Studio,5分钟轻松实现一张报表
查看>>
(译)如何使用cocos2d和box2d来制作一个Breakout游戏:第一部分
查看>>
计算机图形学(一) 图形系统综述
查看>>
持续集成(CI)- 几种测试的区别(摘录)
查看>>
多用户虚拟Web3D环境Deep MatrixIP9 1.04发布
查看>>
求高手,求解释
查看>>
[MSSQL]NTILE另类分页有么有?!
查看>>
winform datagridview 通过弹出小窗口来隐藏列 和冻结窗口
查看>>
Jquery闪烁提示特效
查看>>
最佳6款用于移动网站开发的 jQuery 图片滑块插件
查看>>