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

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设计模式源代码——自己看pdf写的

    以上只是部分Java设计模式的介绍,实际的“DesignPatterns”压缩包可能包含了这些模式的源代码实现,通过阅读和学习这些代码,开发者可以更好地理解和运用设计模式,提升代码质量。同时,结合博主提供的博客链接,...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    设计模式-Java语言中的应用(pdf)

    通过深入学习《设计模式——Java语言中的应用》,开发者能够更好地理解和应用这些模式,从而编写出更加高效、可扩展的Java程序。无论是初级开发者还是经验丰富的程序员,都应该不断探索和实践设计模式,以提升自己的...

    Java与模式——源码

    《Java与模式——源码》这个主题涉及到的是Java编程语言中的设计模式应用,以及如何通过源代码来理解和学习这些模式。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更易读、易维护、...

    设计模式——装饰模式

    比如,Mocha.java、Whip.java和Soy.java可能是具体的装饰器,分别表示添加摩卡、奶油或豆奶到饮料中。 在实际应用中,装饰模式的使用流程大致如下: 1. 客户端创建一个Concrete Component对象。 2. 客户端可以将该...

    java设计模式经典教程

    ### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...

    装饰模式——装饰模式.doc

    装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...

    java设计模式

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

    java 设计模式幽默解读

    "大牛解读Java设计模式.pdf"这本书籍,作为这个主题的载体,很可能是由资深专家撰写,用生动的语言和实例帮助读者理解抽象的设计概念,从而提升他们的编程技能。无论你是初学者还是有经验的开发者,都能从中受益匪浅...

    Java设计模式精讲1

    总结来说,Java设计模式的学习是一条不断深化的过程,它从UML开始,到设计模式的具体分类和应用,再到软件设计原则的领悟,每一步都是提升个人技术能力的重要环节。通过不断的学习和实践,开发者能够成为一名更加...

    java设计模式(23种设计模式大全)

    根据提供的标题、描述以及部分内容,本文将深入探讨Java设计模式,并着重分析23种常见的设计模式,以帮助Java程序员更好地理解和应用这些模式。 ### Java设计模式概述 Java设计模式是面向对象软件设计的一种通用可...

    Java与模式(闫宏)

    《Java与模式》是闫宏大师的一部经典之作,它将古老的哲学智慧——道德经的智慧,巧妙地融入到现代编程语言Java的设计模式之中。这本书不仅深入浅出地讲解了23种经典的设计模式,还提供了丰富的实践案例,旨在帮助...

    java设计模式——告诉新手一些不知道的东西

    在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...

    Java设计模式综合应用场景

    在这个实验报告中,主要讨论了三种设计模式——策略模式、装饰模式和工厂模式的综合运用,以解决一个国际电子商务系统的订单处理问题。 1. **策略模式**: 策略模式的核心在于将算法族封装在独立的可互换的策略类...

    设计模式——JAVA.docx

    ### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...

    JAVA核心知识点整理——java自学资料.rar

    8. **设计模式**:了解并能应用常见的设计模式,如单例、工厂、观察者、装饰器等,能提高代码的可维护性和复用性。 9. **垃圾回收与内存管理**:理解JVM的工作原理,包括内存区域划分、垃圾回收机制、性能调优等,...

    java设计模式(1)

    ### Java设计模式(1)——理解与应用 #### 一、设计模式概述 设计模式是在软件工程领域中,为了应对特定问题或情境而形成的最佳实践集合。这些模式可以帮助开发者更高效地解决常见问题,提高代码的可重用性和可...

    Head.First设计模式_PDF——书中源代码

    在Java编程中,设计模式被广泛应用于构建大型、复杂系统,以确保代码的高效性和灵活性。以下是《Head First设计模式》中涵盖的一些主要设计模式及其要点: 1. **工厂模式**:提供一个创建对象的接口,使代码可以...

Global site tag (gtag.js) - Google Analytics