`
zzq19860626
  • 浏览: 261129 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
B20df9e2-fb3d-3644-9f72-c1619842f682
设计模式学习笔记
浏览量:178034
87eaf24f-812a-3463-8e65-e3197d2ad8c2
java虚拟机
浏览量:26210
社区版块
存档分类
最新评论

JAVA设计模式学习12——装饰器模式

阅读更多

装饰(Decorator)模式属于设计模式里的结构模式,通过装饰类动态的给一个对象添加一些额外的职责。装饰模式也叫包装(wrapper)模式。装饰模式有如下的角色:

抽象构件(component)角色:这个角色用来规范被装饰的对象,一般用接口方式给出。

具体构件(concrete component)角色:被装饰的类。

装饰(decorator)角色:持有一个构件对象的实例。并定义一个跟抽象构件一直的接口。

具体(concrete  decorator 装饰角色:负责给具体构件添加附加职责的类。在实际使用中多数情况下装饰角色和具体装饰角色可能由一个类来承担。

装饰模式的类图如下:


 

装饰模式的例子在生活中很常见,比如房子装修,那房子还是那个房子,只是在房子墙壁上做粉刷,贴墙纸,挂饰品等。java里面的io流,我们经常如下使用:

 

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

 

这个就是装饰模式的使用。还有句话说人靠衣装,美靠靓装。这里就举个程序媛打扮自己的例子来说装饰模式。程序媛打扮自己的模型如下

package decorator;

public interface 女人 {

	public void 打扮();
	
}
 
package decorator;

public class 程序媛 implements 女人 {

	@Override
	public void 打扮() {
		
		System.out.println("开始我是素颜。");

	}

}
 
package decorator;

public class 化妆 implements 女人 {

	private 女人 女人;
	@Override
	public void 打扮() {
		女人.打扮();
	}

}
 
package decorator;

public class 画眉  extends 化妆 {

	private 女人 女人;
	
	
	public 画眉(女人 女人) {
		super();
		this.女人 = 女人;
	}


	public void 打扮() {
		System.out.println("画眉了,漂亮了一些。");
		女人.打扮();
	}

}
 
package decorator;

public class 刷睫毛  extends 化妆 {

	private 女人 女人;
	
	
	public 刷睫毛(女人 女人) {
		super();
		this.女人 = 女人;
	}


	public void 打扮() {
		System.out.println("刷睫毛了,更漂亮了一些。");
		女人.打扮();
	}

}
 
package decorator;

public class 涂口红  extends 化妆 {

	private 女人 女人;
	
	
	public 涂口红(女人 女人) {
		super();
		this.女人 = 女人;
		打扮();
	}


	public void 打扮() {
		System.out.println("有了口红,哇塞,狐狸精一个!");
		女人.打扮();
	}

}
 
package decorator;

public class Client {

	/**
	 *作者:alaric
	 *时间:2013-7-22下午10:57:13
	 *描述:测试
	 */
	public static void main(String[] args) {

		女人 女1 = new 程序媛();
		new 涂口红(new 刷睫毛(new 画眉(女1)));
		
	}

}

 运行结果:

有了口红,哇塞,狐狸精一个!

刷睫毛了,更漂亮了一些。

画眉了,漂亮了一些。

开始我是素颜。

 

通过上面例子我们可以看到,装饰模式在于在原有的功能上添加新的职责。装饰模式能够提供比继承更灵活的对象扩展能力,但是也往往由于这种灵活性会是系统调用变的复杂。
ps:最近重新学习设计模式,所写相关笔记纯属个人对书本和资料的理解,如有不到之处请大家指出,共同探讨学习设计模式。 
 

设计模式系列目录:

  • 大小: 10.6 KB
  • 大小: 14.6 KB
3
1
分享到:
评论
10 楼 zzq19860626 2013-11-21  
cwqcwqmax9 写道
装饰类若用于业务类,会产生很多类对象,给后期维护带来麻烦

很多设计模式,比如策略模式,状态模式都会产生很多类。开发中要看实际情况,不能死板硬套,不能为了模式而模式。
9 楼 zzq19860626 2013-11-21  
cwqcwqmax9 写道
装饰模式,是由客户端代码显示的去调用来装饰原有类的,但代理模式客户端更本不需要知道的,在他看来它引用的对象还是原来的。

到位:idea:
8 楼 cwqcwqmax9 2013-11-21  
装饰模式,是由客户端代码显示的去调用来装饰原有类的,但代理模式客户端更本不需要知道的,在他看来它引用的对象还是原来的。
7 楼 cwqcwqmax9 2013-11-21  
装饰类若用于业务类,会产生很多类对象,给后期维护带来麻烦
6 楼 cwqcwqmax9 2013-11-21  
zzq19860626 写道
cwqcwqmax9 写道
装饰器  相比 与代理 是 对原有的类 加了新方法  但 原来的方法 不变,而代理是  不增加新方法 是对原方法加以 改变。

可以说装饰模式和代理模式形似神不是,他们结构一样,但是关键在于,你是简化减少后面的对象调用还是为了后面对象更完美。
前面代理模式我举例,秘书帮助ceo解决实际问题,减少ceo的繁忙,代替他处理事务。
装饰模式是为了让你的对象让客户端更容易理解和调用。

也就是说客户端必须在调用前 自己装配代码。感觉这个模式适合包内工具类的设计如io流,不适合用于复杂多变的业务类。
5 楼 cwqcwqmax9 2013-11-21  
zzq19860626 写道
cwqcwqmax9 写道
该模式 实际运用中 打破了工厂类 +  面向接口的   解耦性  编程,加大了类间的耦合性。

哪里打破了?能描述详细点吗?

当客户端代码使用你定义的类时,你只需给出接口  ,和工厂类 ,它根据工厂类来 获取对象,并调用方法,无需知道方法的内部细节,包括是否有修改,但装饰器确实要求客户端显示调用,并组装该类,在调用,要关注更多关于该类的细节。
4 楼 zzq19860626 2013-11-21  
cwqcwqmax9 写道
该模式 实际运用中 打破了工厂类 +  面向接口的   解耦性  编程,加大了类间的耦合性。

哪里打破了?能描述详细点吗?
3 楼 zzq19860626 2013-11-21  
cwqcwqmax9 写道
装饰器  相比 与代理 是 对原有的类 加了新方法  但 原来的方法 不变,而代理是  不增加新方法 是对原方法加以 改变。

可以说装饰模式和代理模式形似神不是,他们结构一样,但是关键在于,你是简化减少后面的对象调用还是为了后面对象更完美。
前面代理模式我举例,秘书帮助ceo解决实际问题,减少ceo的繁忙,代替他处理事务。
装饰模式是为了让你的对象让客户端更容易理解和调用。
2 楼 cwqcwqmax9 2013-11-20  
该模式 实际运用中 打破了工厂类 +  面向接口的   解耦性  编程,加大了类间的耦合性。
1 楼 cwqcwqmax9 2013-11-20  
装饰器  相比 与代理 是 对原有的类 加了新方法  但 原来的方法 不变,而代理是  不增加新方法 是对原方法加以 改变。

相关推荐

    Java设计模式 版本2

    Java设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    Pattern-Decorator-Java:设计模式工作坊——装饰者模式

    您必须实现装饰器模式,以便可以在运行时添加提到的服务。 作为开发服务如何工作的示例,在运行时创建一个用加密和缓存装饰的 JSON 策略,以及一个带有日志记录的 XML 策略。 请记住,您必须提供源代码和详细说明所...

    深入浅出设计模式(中文版电子版)

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

    深入浅出设计模式(中文版)

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java和设计模式ppt教程

    java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...

    design-pattern-java.pdf

    设计模式趣味学习(复习) 设计模式趣味学习(复习) 设计模式与足球(一) 设计模式与足球(二) 设计模式与足球(三) 设计模式与足球(四) 设计模式综合应用实例 设计模式综合应用实例 多人联机射击游戏 多人...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷3

    pattern/src/structure/decorator //12.2装饰器模式 pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷1

    pattern/src/structure/decorator //12.2装饰器模式 pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷9

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制...

    设计模式Demo

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷10

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷5

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷7

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷2

    pattern/src/structure/decorator //12.2装饰器模式 pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/...

Global site tag (gtag.js) - Google Analytics