<三>读《《大话设计模式》》之装饰模式

学习这个模式比前几个要难点了,搞了半天才弄懂。好吧,也许是我脑子慢

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

《《大话设计模式》》一书中以“小菜”去约会需要打扮为例子来展开学习装饰模式的,对于该模式,本人的理解是:就是对一个已有的算法进行二次加工,但又不改变原来的代码,在原有的数据处理中再一次进行处理。

好了不多说,通过代码去理解会更好一点,本人代码中的注解很关键,都是我在编写的过程中理解总结出来的,对理解装饰模式很关键。

1、人要打扮,要穿衣服,所以第一个对象是人

/*

*
装饰模式

*
要装饰的对象

*/

publicclass Person {

private String
name;

public Person(){ }

public Person (String name){

this.name = name;

}

public 
void show(){

System.out.println("装饰的"+name);

}

}

2、装饰类,我要用衣服来装饰自己,所有要定义一个装饰类来作为具体装饰物的父类

/*

*
装饰的衣服大类

*/

public 
class Finery
extends Person {

private Person
person;

//打扮谁

publicvoid decorator(Person person){

this.person = person;

}

@Override

publicvoid show() {

//
TODO Auto-generated method stub

if(person !=
null){

person.show();//实际执行的是person中的方法。为什么还要增加类Finery呢?因为人装饰的是衣服,而衣服有很多种(子类)

}

}

public Person getPerson() {

returnperson;

}

publicvoid setPerson(Person person) {

this.person = person;

}

}

3、T恤类,装饰物为T恤

/*

*
具体的类,t恤,要装饰到人身上

*/

publicclass TShirts
extends
Finery {

publicvoid
show(){

System.out.println("穿上T恤!");//在实际开发中,此应该为对人数据进行处理的过程。

super.show();//父类处理的过程

}

}

4、裤子类

/*

*
具体的类,裤子,要装饰到人身上

*/

publicclass BigTrouser
extends Finery {

publicvoid
show(){

System.out.println("穿上裤子!");

super.show();

}

}

5、客户端调用类

publicclass DecoratorClient {

/**

* @param args

*/

publicstaticvoid main(String[] args) {

//
TODO Auto-generated method stub

Personperson = new Person("我");

TShirtstShirts =
new
TShirts();

BigTrousertrouser =
new
BigTrouser();

//装饰过程

tShirts.decorator(person);

trouser.decorator(tShirts);

trouser.show();

}

}

打印结果为:

穿上裤子!

穿上T恤!

装饰的我

分析打印结果:

当程序执行到trouser.show()时,打印:穿上裤子!,这个没有问题,这个方法中还有一个方法是super.show(),此事super(父类)为TShirts对象,为什么呢?请看trouser.decorator(tShirts);这个就是将裤子的父类变成T恤了,所以super.show()方法其实执行的是T恤类中的System.out.println("穿上T恤!");  
super.show();这两步,打印“穿上T恤”后,执行super.show(),此事super是谁呢?根据tShirts.decorator(person);可以看出就是Person本人了。这样会执行Person类中的show方法:System.out.println("装饰的"+name);即打印出装饰的我。好了介绍完了,这个对于我来说很难理解到。有问题留言哟,谢谢!

附上装饰模式的结构图

总结:装饰模式是为已有功能动态的添加更多功能的一种方式。当系统需要更新功能的时候,是向旧的类中添加新的代码,这些新的代码通常装饰了原有类的核心职责或主要行为,比如穿T恤、裤子装饰自己,但这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。

附上源代码地址:http://download.csdn.net/detail/jzhf2012/8086335

时间: 2024-11-07 06:16:27

<三>读《《大话设计模式》》之装饰模式的相关文章

学习大话设计模式06_装饰模式

装饰模式(Decorator): 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 1 /** 2 * Component 是定义一个对象接口,可以给这些对象动态地添加职责 3 * @author Monica 4 * 5 */ 6 public abstract class Component { 7 public abstract void Operation(); 8 } 9 10 11 /** 12 * ConcreteComponent 是定义了一个具体

&lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

又和大家见面了,能够坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>讲解策略模式是以商场收银软件程序开头的,那么问题来了,哪家商场收银软件强,开玩笑了.读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.客户端依赖两个类,耦合性高:2.如果算法过多则需要写很多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单价*打折算法=售价.

大话设计模式_装饰模式(Java代码)

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 简单描述:1一个父类A(主要给各具体装饰者可以设置待装饰对象),1个具体待装饰类(继承于父类A),1个抽象装饰者(继承父类A),多个具体装饰者(继承抽象装饰者).装饰者持有父类A的引用,每个装饰者在调用方法时都先调用持有的引用的对应方法,另外可在方法中再添加自己的功能(貌似描述得比较复杂,其实就是一传一,每个中间者都可以添加自身的功能) 大话设计模式中的截图: Component是定义一个对象接口,可以给

&lt;十一&gt;读&lt;&lt;大话设计模式&gt;&gt;之抽象工厂模式

学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难,就是设计程序遵循一些原则,让代码可复用,在修改的时候不用涉及太多的类,扩展方便,抽象工厂模式名字听起来抽象,但理解起来一点也不抽象,用语言可能不好理解,我喜欢通过代码理解,然后成为自己的东西. 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. <<大话设计模式>>以项目上线时想换另外一个数据库为例子展开的,假如我没原来用的是SqlServer,现在换成access,代码如下: 1.访问数

&lt;六&gt;读&lt;&lt;大话设计模式&gt;&gt;之原型模式

原型模式也是很简单的一种模式,对于java来说已经有相应的接口了(Cloneable).关于原型模式<<大话设计模式>>是以投放简历作为例子讲解的,即我要投放很多简历,其实每个简历都一样,所以只要我写好一份,其他的复制就行了,其实就是今天讲的原型模式,就是把要复制的类对象的属性复制到另外一个对象上(其实不是复制而是对象的引用改变). 原型模型:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 浅复制VS深复制 关于克隆有两个概念 浅复制:就是只复制值类型的字段,不能

&lt;七&gt;读&lt;&lt;大话设计模式&gt;&gt;之模板模型

哈哈,真没想到,不知不觉已经写到第七篇文章了,看来本人还是很有毅力的.其实坚持一件事很简单,只要你每天不断的朝着自己的目标出发,任何事情都不会挡着你.好了大道理不多说,谁都懂,那看看这个模板模式大家懂不懂了. 对于模板模式可能听起来很吓人,其实大家都用过,只是不知道罢了,也很简单.从字面意思上看就是我写出一个模板,然后其他类直接继承它就可以拥有模板类中的东西了,听起来像继承的定义,是的,就像现在开发一个论坛,为了能够开发速度更快,我们通常就是网上找一个模板下载下来,然后在模板基础上进行二次开发,

&lt;一&gt;读&lt;&lt;大话设计模式&gt;&gt;之简单工厂模式

工厂模式虽然简单,但是写下这篇文章却不简单.第一:本人经过内心的挣扎后才决定开始写博文的,为什么呢,因为好长时间没有写了,对自己的文学功底也是好不自信,但是技术这东西你不写出来你真不知道自己掌握多少,或者是否掌握其本质:第二:老婆怀孕了,没时间写了,但是我还是挤出时间开始写,于是这篇文章在这样的环境下成了,以后还有后续的文章,谢谢关注! 为什么从设计模式开始学习呢?其实以前对设计模式有些了解,但是用不到也就没有深入,现在差不多也忘完了,本人工作三年了,对一些大众上的技术(比如struts2.sp

&lt;九&gt;读&lt;&lt;大话设计模式&gt;&gt;之建造者模式

学习了这么多模式,其实回想一下其实也没什么,就是用不同的方式设计代码,保证代码的可扩展性.复用等,稍微对代码进行一下修改就是另外一种模式.在我们工作中其实已经用了很多模式了,只不过不知道或者没留意他叫什么而已,无所谓,只要会用一切都是浮云. 关于<<大话设计模式>>对建造者模式的讲解是以画一个人来作为例子讲解的.人分为高人.矮人.胖人.瘦人等,但都是人,但当你去画一个人的时候,画的过程都是稳定的,都需要画头.身子.手.脚,不同的是建造的细节是不一样的.所以如果你需要将一个复杂的构件

&lt;十三&gt;读&lt;&lt;大话设计模式&gt;&gt;之适配器模式

其实我感觉这个模式是最简单的一个设计模式了,看着名字可能不明白,其原来就是一个接口.比如电脑的USB接口,内部不管外部插得什么设备只要连接USB,内部都能接收到信号,原因就是两设备之间多了个桥梁------USB. 适配器模式:将一个类的接口转换成客户希望的另一个接口.它使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. <<大话设计模式>>是以NBA球员在外国培训不懂外语,而需要翻译者来帮其翻译,那这个翻译者就是接口了.好啰嗦啊,还是用代码解释一切,因为程序员就是活在代码

&lt;八&gt;读&lt;&lt;大话设计模式&gt;&gt;之外观模式

外观模式其实很好理解的,就是将表面的东西展示给人看,内部的东西你不知道的(因为已经封装好了),比如一个外部系统要和公司内部5个系统进行交互,而这5个系统之间也有交互,那么第一种就是外部系统和5个系统都进行交互:第二种就是做一个接口将外部系统需要的逻辑封装成一个方法,该方法中包含了关于5个系统的交互方式,这样外部系统就不用直接和5个系统交互了,直接调用接口完事.外观模式也叫门面模式,其实说白了就是把要用的东西封装起来使交互更加方便. 外观模式定义:为子系统中的一组接口提供一个一致的界面,此模式定义