您的位置:首页 > 其它

设计模式之三:装饰者模式(简单实现(星巴兹咖啡))

2012-09-14 09:35 477 查看
装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。(星巴兹咖啡)

设计原则:类应该对扩展开放,对修改关闭。

我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可以搭配新的行为。如能实现这样的目标,有什么好处呢?这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求。

工程名称:Decorator(eclipse) 下载目录:http://www.cnblogs.com/jrsmith/admin/Files.aspx ,Decorator.zip

View Code

package com.jyu.extendscondiment;

import com.jyu.abstractclass.Beverage;
import com.jyu.abstractclass.Condiment;

/**
* 奶泡
* @author JRSmith
*
*/
public class Whip extends Condiment {

protected Beverage beverage;

public Whip(Beverage beverage) {
this.beverage = beverage;
}

@Override
public String getDescription() {
return this.beverage.getDescription() + " , Whip";
}

@Override
public double cost() {
return 0.10 + this.beverage.cost();
}

}


package com.jyu.test;

import com.jyu.abstractclass.Beverage;
import com.jyu.extendsbeverage.DarkRoast;
import com.jyu.extendsbeverage.Espresso;
import com.jyu.extendsbeverage.HouseBlend;
import com.jyu.extendscondiment.Mocha;
import com.jyu.extendscondiment.Soy;
import com.jyu.extendscondiment.Whip;

public class StarbuzzCoffee {

/**
* @param args
*/
public static void main(String[] args) {

/**订一杯Espresso,不需要调料,打印出它的描述与价钱*/
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " $" + beverage.cost());

/**制造出一个DarkRoast对象。用Mocha装饰它,用第二个Mocha装饰它,用Whip装饰它*/
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
System.out.println(beverage2.getDescription() + " $" + beverage2.cost());

/**最后,再来一杯调料为豆浆、摩卡、奶泡的HouseBlend咖啡*/
Beverage beverage3 = new HouseBlend();
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
System.out.println(beverage3.getDescription() + " $" + beverage3.cost());

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: