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

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

装饰模式(Decorator Pattern)

        又名包装(Wrapper)模式,装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案。
 装饰模式以对client透明的方式动态的给一个对象附加上很多其它的责任。

换言之,client并不会认为对象在装饰前和装饰后有什么差别。

【转载使用,请注明出处:

       装饰模式的特点是,在不创建很多其它子类的模式下,将对象的功能加以扩展。
       以下我们介绍,装饰模式与类继承的差别:
       1、 装饰模式是一种动态行为,对已经存在的类进行任意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。

       2、 装饰模式扩展的是对象的功能,不须要添加类的数量,而类继承是扩展类的功能。在继承的关系中,比如。添加某个对象的功能,会通过继承的方式。在子类中添加须要的函数(方法)。

       3、 装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象。也就是装饰包裹真实的对象。
装饰模式把对client的调用委派给被装饰的类,装饰模式的关键在于这样的扩展全然透明的。以下介绍装饰模式的构成。

装饰模式的构成:

       1、抽象构建角色(Component),给出一个抽象的接口,以规范准备接受附加责任的对象。

比如:i/o流里面InputStream/OutputStream和Reader/Writer。

       2、详细的构建角色(ConcreteComponent),定义一个将要接受附加责任的类。比如:i/o里面的FileOutputStream和FileInputStream。
      3、装饰角色(Docotator),持有一个抽象构建(Component)角色的引用,并定义一个与抽象构建一致的接口。比如:i/o里面的FilerOutputStream和FilterInputStream。

      4、详细的装饰角色(ConcreteDecorator),负责给构建对象“贴上”附加的责任。比如:i/o流里面的BufferedOutputStream和BufferedInputStream以及DataOutputStream和DataInputSrtream。
 

装饰模式的特点:

     1、装饰对象和真实对象具有同样的接口。这样client对象就能够以真实的对象的同样方式和装饰对象交互。
     2、装饰对象包括一个真实对象的应用(reference)。

     3、装饰对象接受全部来自client的请求。它把这些请求转发个真实的对象。
     4、装饰对象能够在转发这些请求曾经或者以后添加一些附加的功能。这样就能确保在执行时。不用改动给定对象结构就能够在外部添加附加的功能。

在面向对象的程序设计中。一般是使用继承的关心来扩展给指定类的功能。

演示样例案例

/** * 抽象构建角色 * @author Mahc * */public interface Component {	/**	 * 某项功能的操作	 */	public void function();}/** * 详细的构建角色 * @author Mahc * */public class ConcreteComponent implements Component{	@Override	public void function() {		System.out.println("Function A");	}}/** * 装饰角色 * @author Mahc * */public class Decorate implements Component {	private Component component;		public Decorate(Component component) {		this.component = component;	}	@Override	public void function() {				component.function();	}}/** * 详细的装饰角色 * @author Mahc * */public class ConcreteDecorator extends Decorate{	public ConcreteDecorator(Component component) {		super(component);	}		@Override	public void function() {		super.function();		this.otherFunction();	}		private void otherFunction(){		System.out.println("otherFunction B");	}}/** * 装饰模式測试用例 * @author Mahc * */public class TestDecoratorPattern {	public static void main(String[] args) {				ConcreteComponent component = new ConcreteComponent();		ConcreteDecorator decorator = new ConcreteDecorator(component);		System.out.println("真实对象(类)调用function()");		component.function();		System.out.println("包装对象(类)调用function()");		decorator.function();	}}

 【转载使用,请注明出处:

 

你可能感兴趣的文章
9月27日28家中国域名商六类国际域名注册保有量统计
查看>>
zabbix监控之lvs
查看>>
百度贴吧在线外链制作
查看>>
如何在阿里云•对象存储OSS托管用户域名的https证书
查看>>
FreeMarker速查手册
查看>>
929. Unique Email Address - LeetCode
查看>>
Cisco 3560 级联端口不通的原因
查看>>
Zend Studio 无法打开的解决办法
查看>>
IEEE 802.3标准
查看>>
[安装程序]HDDScan(硬盘坏道检测工具) 3.3[详细检测你的硬盘信息]
查看>>
我的友情链接
查看>>
Linux基础笔记用户管理
查看>>
用Java集合中的Collections.sort方法对list排序的两种方法
查看>>
利用mysql的注射点得到更多mysql的信息
查看>>
好程序员web前端分享CSS基础篇
查看>>
粘性(sticky)mac地址
查看>>
error: no valid connection
查看>>
一句话说明数组和集合的区别
查看>>
漫画:混乱的标记语言XHTML2HTML5
查看>>
Mac环境下svn的使用
查看>>