登陆注册
8183300000205

第205章 2 装饰器模式

通过例子告诉大家一点:任何设计不是一成不变的、模式的应用是极其灵活的……

大B:“装饰模式:Decorator常被翻译成‘装饰’,我觉得翻译成‘油漆工’更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee。这两种实体在Decorator模式中是必须的。”

小A:“那我们应该如何去定义它?”

大B:“动态给一个对象添加一些额外的职责,就象在墙上刷油漆。使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。”

下面是以上各个类的意义:

1、Ingredient(成分):所有类的父类,包括它们共有的方法,一般为抽象类且方法都有默认的实现,也可以为接口。它有Bread和Decorator两个子类。这种实际不存在的,系统需要的抽象类仅仅表示一个概念,2、Bread(面包):就是我们三明治中必须的两片面包。它是系统中最基本的元素,也是被装饰的元素,和IO中的媒质流(原始流)一个意义。在装饰器模式中属于一类角色,所以其颜色为紫色。

3、Decorator(装饰器):所有其它成分的父类,这些成分可以是猪肉、羊肉、青菜、芹菜。这也是一个实际不存在的类,仅仅表示一个概念,即具有装饰功能的所有对象的父类。

4、Pork(猪肉):具体的一个成分,不过它作为装饰成分和面包搭配。

5、Mutton(羊肉):同上。

6、Celery(芹菜):同上。

7、Greengrocery(青菜):同上。

大B:“我们现在来总结一下装饰器模式中的四种角色:1、被装饰对象(Bread);2、装饰对象(四种);3、装饰器(Decorator);4、公共接口或抽象类(Ingredient)。其中1和2是系统或者实际存在的,3和4是实现装饰功能需要的抽象类。写段代码体会其威力!程序很简单,但是实现的方法中可以加入你需要的方法,意境慢慢体会吧!”

//Ingredient。java

public abstract class Ingredient{

public abstract String getDescription();

public abstract double getCost();

public void printDescription(){

System。out。println(“Name” this。getDescription());

System。out。println(“Price RMB” this。getCost());

}

}

大B:“所有成分的父类,抽象类有一个描述自己的方法和一个得到价格的方法,以及一个打印自身描述和价格的方法。”

小A:“这个方法不就是与刚才的那两个方法构成模板方法吗?”

//Bread。java

public class Bread extends Ingredient{

private String description;

public Bread(String desc){

this。description=desc;

}

public String getDescription(){

return description;

}

public double getCost(){

return 2.48;

}

}

大B:“面包类,因为它是一个具体的成份,因此实现父类的所有的抽象方法。描述可以通过构造器传入,也可以通过set方法传入。同样价格也是一样的,就很简单地返回了。”

//Decorator。java

public abstract class Decorator extends Ingredient{

Ingredient ingredient;

public Decorator(Ingredient igd){

this。ingredient=igd;

}

public abstract String getDescription();

public abstract double getCost();

}

大B:“装饰器对象,所有具体装饰器对象父类。它最经典的特征就是:1、必须有一个它自己的父类为自己的成员变量;2、必须继承公共父类。这是因为装饰器也是一种成份,只不过是那些具体具有装饰功能的成份的公共抽象罢了。在我们的例子中就是有一个Ingredient作为其成员变量。Decorator继承了Ingredient类。”

//Pork。java

public class Pork extends Decorator{

public Pork(Ingredient igd){

super(igd);

}

public String getDescription(){

String base=ingredient。getDescription();

return base “\n” “Decrocated with Pork!”;

}

public double getCost(){

double basePrice=ingredient。getCost();

double porkPrice=1.8;

return basePrice porkPrice;

}

}

大B:“具体的猪肉成份,同时也是一个具体的装饰器,因此它继承了Decorator类。猪肉装饰器装饰可以所有的其他对象,因此通过构造器传入一个Ingredient的实例,程序中调用了父类的构造方法,主要父类实现了这样的逻辑关系。同样因为方法是具体的成份,所以getDescription得到了实现,不过由于它是具有装饰功能的成份,因此它的描述包含了被装饰成份的描述和自身的描述。价格也是一样的。价格放回的格式被装饰成份与猪肉成份的种价格哦!”

大B:“从刚才的两个方法中我们可以看出,猪肉装饰器的功能得到了增强,它不仅仅有自己的描述和价格,还包含被装饰成份的描述和价格。主要是因为被装饰成份是它的成员变量,因此可以任意调用它们的方法,同时可以增加自己的额外的共同,这样就增强了原来成份的功能。”

//Mutton。java

public class Mutton extends Decorator{

public Mutton(Ingredient igd){

super(igd);

}

public String getDescription(){

String base=ingredient。getDescription();

return base “\n” “Decrocated with Mutton!”;

}

public double getCost(){

double basePrice=ingredient。getCost();

double muttonPrice=2.3;

return basePrice muttonPrice;

}

}

羊肉的包装器。

//Celery。java

public class Celery extends Decorator{

public Celery(Ingredient igd){

super(igd);

}

public String getDescription(){

String base=ingredient。getDescription();

return base “\n” “Decrocated with Celery!”;

}

public double getCost(){

double basePrice=ingredient。getCost();

double celeryPrice=0.6;

return basePrice celeryPrice;

}

}

芹菜的包装器。

//GreenGrocery。java

public class GreenGrocery extends Decorator{

public GreenGrocery(Ingredient igd){

super(igd);

}

public String getDescription(){

String base=ingredient。getDescription();

return base “\n” “Decrocated with GreenGrocery!”;

}

public double getCost(){

double basePrice=ingredient。getCost();

double greenGroceryPrice=0.4;

return basePrice greenGroceryPrice;

}

}

青菜的包装器。

大B:“我们来领略装饰器模式的神奇吧!我们有一个测试类,其中建立夹羊肉的三明治、全蔬菜的三明治、全荤的三明治。”

小A:“好像真的很香哦!”

public class DecoratorTest{

public static void main(String[]args){

Ingredient compound=new Mutton(new Celery(new Bread(“Master24s Bread”)));

compound。printDescription();

compound=new Celery(new GreenGrocery(new Bread(“Bread with milk”)));

compound。printDescription();

compound=new Mutton(new Pork(new Bread(“Bread with cheese”)));

compound。printDescription();

}

}

大B:“这就是一个简单的装饰器类!假如你对想中国式的吃法,可以将加入馒头、春卷皮、蛋皮……夹菜可以为肉丝……突然想到了京酱肉丝。”

同类推荐
  • 爱上我的“手机女友”

    爱上我的“手机女友”

    本书共有五个部分:第一章:千娇百媚的我—手机门类大搜索第二章:了解我的心—手机“芯”理学第三章:不一样的我不一样的美—手机的万种风情第四章:命中注定我爱你—神秘手机星座解读第五章:有求必应贴心女友—手机的绝世武功通过这本书,想要购入手机的你会知道哪款手机女友更适合你,已有心仪手机的你可以让手机女友懂得更多变得更聪明。希望这本书能够帮助你在手机选购上和手机使用上更舒心、安心、贴心。
  • 如何操作电脑

    如何操作电脑

    信息社会是科技、文化发展,知识爆炸的结果。不懂得计算机,将处于半文盲的境地。因此,对于计算机,不仅要作为工具使用,已经是一项文化普及的要求。我们不仅要会使用计算机做一些诸如文字处理等具体工作,更要培养一种计算机意识。
  • 初级会计电算化

    初级会计电算化

    本书是作者根据历年会计从业资格考试的考试大纲以及多年对真题的分析,并结合多为专家、学者的实践经验而编写的。本书主要分为八套模拟试卷,以对考生考前的学习进行模拟实战,达到提高考生成绩的目的。
  • 三维动画审美谈

    三维动画审美谈

    数字时代,美的标准充满更多的不确定性。而三维动画以数字图像形式成为这个图时代的代表。三维动画及三维图像不仅仅是由于应用了仿真数字图像技术而带来的虚拟空间,还有更多的是由三维图像技术所引发或引导的被扩展的图像技术,这些技术无不应用在现代视觉设计领域的各个方面,并且,由此引起社会的追热,引起审美观念的改变。这些改变是在进行中的,变化中的,也是在发展中的。对于未知的美,我们做的只是追寻和记录,我们不知道以后的美将会是什么样,尽管我们苦苦追寻,孜孜探讨,同时也在默默审视。我们在追寻中享受美,在探讨中认知美,在审视中体验美……
  • 从平凡到神奇

    从平凡到神奇

    本书结合多年的开店经验,全面地讲解了在淘宝网开设店铺的相关知识,为准备在淘宝网创业的卖家及刚刚创建店铺的店主,提供全面的开店和经营方面的指导。本书按照淘宝开店的流程安排内容,侧重每个步骤中的实际技巧。本书分3个部分:如何在淘宝开店、如何开好店、如何做强做大店铺。前3章介绍了在淘宝网开设店铺的基础知识,指导读者在开设店铺前做好准备工作,以及建立起自己的店铺,并且完成店铺的第一笔交易;第4章至第7章主要介绍了网店装修和推广的方法,以及网店的物流经验和技巧;第8章着重介绍了将网店做大做强的方法,帮助卖家在开店和经营中树立品牌意识,做大做强自己的店铺。
热门推荐
  • 菠萝萝卜蜜

    菠萝萝卜蜜

    他永远无法忘却,那年夏天提着书箱,朝气蓬勃走进他的班级的孩子们...
  • 穿越一品皇后

    穿越一品皇后

    天启初年,遇大旱,国师言:将会有凤星出世,解大旱,平天下
  • 综漫之人生旅程

    综漫之人生旅程

    第一世,她是公主,却被拿去交换;第二世,她是音乐世家千金,却死在自己最信任的人手下;第三世,她是家族的大小姐,穿越到二次元,这一次,她只想要一个平静的人生!却不料事与愿违,她再次被卷入纷争之中!(情节虚构,切勿模仿)
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 遥知不是匪

    遥知不是匪

    她今生醉倒在马桶边,穿越于茅房旁;她今生被男友劈腿,穿越成为杀人犯!是她的劫数,躲不掉,跑不了!不是她的缘份,等不到,争不来!当心碎至万念俱灰时,夏佑宸一柄长剑直抵胸口,“你的命是我的,任何人,包括当今圣上都拿不走!我让你三更死你便活不到五更!所以,你的人,也是我的!我让你躺着,你就不能站着!”她不敢躺,不敢站,背负着杀害六王妃的罪名,被王爷时抓时放,随时可能被杀,也随时可能侥幸存活。游走在生死边缘,她终于奋起反抗,想要与他同归于尽时,他丰神如玉,“很好,在天愿作比翼鸟,在地愿为连理枝……”她便疑心自己的前生必然罪孽深重,否则凤凰涅槃后,尚可以重生,她穿越后却换不来偏安一隅。他贵为皇子,因为长得与父皇最相似,深得父亲的喜欢,被认为最有希望接替皇位的人选。因此受到手足以及大臣的联手陷害,几乎一夜之间,他成为谋权篡位的罪人。他伺机东山再起,却遇到了那个时时刻刻都在拖他后腿的女人,自己的封地又频频出现离奇的杀人案件……
  • 霸道总裁甜心妻

    霸道总裁甜心妻

    此生桑黎的宗旨就是,远离董昊天珍爱自己的家人。只是命运偏偏喜欢跟她开玩笑,为何她再怎么躲避最终还是会遇上那个霸道如同恶魔一般的男人。她只想挣脱这样的命运……
  • 血色樱花之阡陌

    血色樱花之阡陌

    她,还在这里等他。看那血色的花瓣落下。喂,你看见了吗?我在等你。
  • 我会闪避

    我会闪避

    恭喜你挨打到上限,开启德智体全面发展系统,闪避max,力量m....开启失败。叶落皱着眉头,破系统!真香~
  • 老板忠告员工

    老板忠告员工

    美国《时代周刊》杂志资深记者惠德曼·丹尼斯用了大约一年多的时间先后采访了一百个知名企业的老板和总裁,征求他们对员工或部属的看法、期望和要求,并请他们以老板的身份以及对企业、对员工前途高度负责的心态,给员工提出善意的忠告、真挚的嘱托和殷切的寄语,当然还有一些话头话尾的警示,一些明里暗里的戒则,一些深中肯綮的劝勉。这些话差不多是每一个老板对员工一直想吐露的心声,其中有些内容是老板们讳莫如深的。
  • 网游天龙之生死符情

    网游天龙之生死符情

    这是我为我玩了两年的天龙八部所写。但是我在网上看了一下别人写的天龙,感觉很不行,甚至是有点垃圾的感觉所以,再次,我诚挚的向各位读者甚至是正在玩天龙的天龙玩家们,我写的不好别怪我,毕竟我也是天龙玩家,有些地方还不是那么的纯熟