"我曾经以为男子汉应该用继承处理一切,后来我领教到运行时扩展,远比编译时期的继承威力大。"
利用组合(composition)和委托(delegation)可以在运行时具有继承行为的结果。
利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然后,
如果能够组合的做法扩展对象的行为,就可以在运行时动态的进行扩展。
代码应该如同晚霞中的莲花一样的关闭(免于改变),如何晨曦中的莲花一样的开放(能够扩展)。
类应该对扩展开放,对修改关闭。
装饰着模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
装饰者和被装饰者必须是一样的类型,也就是有共同的超类,这就是相当关键的地方。
在这里,我们利用继承达到“类型匹配”,而不是利用继承获得“行为”。
当我们将装饰者与组件组合时,就是在加入新的行为,所得到的薪行为,并不是继承自超类,而是有组合对象的来的。
看demo玩的很happy,感觉也只有这种业务场景能够用到了。也就是一些东西会重复和累加使用,
而且重复累加使用的特性在父类是完成不了的。那么就需要各个子类去完成自己的东西,最后累加到一起。
调料其实不是真实饮料的子类,调料只是为了能够覆盖饮料,把自己加进去。
也就是借助继承。
package cn.partner4java.decorator;
/**
* 饮料,原始的饮料基础类
* @author partner4java
*
*/
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
package cn.partner4java.decorator;
/**
* 调料抽象类 -- 实现它来增加调料
* @author partner4java
*
*/
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
package cn.partner4java.decorator;
/**
*
* @author partner4java
*
*/
public class Espresso extends Beverage {
public Espresso(){
description = "Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
package cn.partner4java.decorator;
/**
*
* @author partner4java
*
*/
public class HouseBlend extends Beverage {
public HouseBlend(){
description = "House Blend Coffee";
}
@Override
public double cost() {
return .89;
}
}
package cn.partner4java.decorator;
/**
* 加入摩卡这个装饰者
* @author partner4java
*
*/
public class Mocha extends CondimentDecorator {
/** 被装饰者 */
Beverage beverage;
/**
* 强制进来一个被装饰者
* @param beverage 被装饰者
*/
public Mocha(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + ",Mocha";
}
@Override
public double cost() {
return .20 + beverage.cost();
}
}
package cn.partner4java.decorator;
/**
* 加入奶泡这个装饰者
* @author partner4java
*
*/
public class Whip extends CondimentDecorator {
/** 被装饰者 */
Beverage beverage;
/**
* 强制进来一个被装饰者
* @param beverage 被装饰者
*/
public Whip(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + ",Whip";
}
@Override
public double cost() {
return .10 + beverage.cost();
}
}
package cn.partner4java.decorator.test;
import cn.partner4java.decorator.Beverage;
import cn.partner4java.decorator.Espresso;
import cn.partner4java.decorator.HouseBlend;
import cn.partner4java.decorator.Mocha;
import cn.partner4java.decorator.Whip;
/**
* 测试装饰者模式
* @author partner4java
*
*/
public class TestDecorator {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " {1}quot; + beverage.cost());
Beverage beverage2 = new HouseBlend();
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription() + " {1}quot; + beverage2.cost());
}
}
分享到:
相关推荐
Head-First-Design-Patterns的官方源码,帮助你更好地学习Head-First-Design-Patterns。
Head.First.设计模式-中文版-带目录Head.First.设计模式-中文版-带目录Head.First.设计模式-中文版-带目录Head.First.设计模式-中文版-带目录Head.First.设计模式-中文版-带目录
Head First Python A Brain-Friendly Guide, 2nd Edition
Head First系列之设计模式 本书的编写方式采用引导式教学。以大量的生活化故事当背景,以图片做背景,阅读起来生动有趣。书中模式告白节目,将设计模式拟人化成节目来宾,畅谈其内在的一切。
HEAD first 设计模式 10HEAD first 设计模式 10HEAD first 设计模式 10HEAD first 设计模式 10HEAD first 设计模式 10HEAD first 设计模式 10HEAD first 设计模式 10HEAD first 设计模式 10
HEAD first 设计模式 10HEAD first 设计模式 10HEAD first 设计模式 10HEAD first 设计模式 10HEAD first 设计模式 10HEAD first 设计模式 10
HeadFirst 设计模式学习笔记3--装饰模式 Demo http://blog.csdn.net/laszloyu/archive/2010/05/12/5582561.aspx
Head First英文原版系列-C语言入门
Head First C# -- Third Edition by Andrew Stellman and Jennifer Greene Copyright © 2013 Andrew Stellman and Jennifer Greene. All rights reserved.
Head.First设计模式-中文版 通俗易懂,图文并茂,将你带入一个模式世界。
Headfirst第三章 装饰者设计模式 C++实现 附加UML类图
Kathy Sierra(javaranch.com的创始人)FHBert Bates是畅销的HeadFirst系列书籍的创立者,也是Sun公司Java开发员认证考试的开发者。 作者以大量的生活化故事当背景,例如第1章是鸭子,第2章是气象站,第3章是咖啡店,...
First head 设计模式1-4章
Head.First设计模式-中文版 通俗易懂,图文并茂,将你带入一个模式世界。
书本配套代码!Head-First-JavaScript-Programming-master
Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现 VS2012 下通过
head first 中文版,好东西要分享,中国的软件需要有共享才能发展,呵呵,图文并茂,很经典的一本设计模式书,做java开发的必看书籍,看后没收获的随时找我,呵呵。
head first 设计模式
head first 设计模式