装饰者模式:
动态的将职责附加到对象上。
系统描述:购买咖啡的系统,购买咖啡时可以加入各种调料,然后结账的时候算上咖啡和调料的钱的总和。
总的饮料抽象类Beverage.java
package cn.beverage.demo; /** * 饮料抽象类 * * @author wy * */ public abstract class Beverage { String desc = "unknow Beverage"; public String getDesc() { return this.desc; } public abstract double cost(); }調料抽象類:Condiment.java:装饰者类必须继承最上层的饮料抽象类。
package cn.beverage.demo; /** * 調料抽象類,装饰者类 * * @author wy * */ public abstract class Condiment extends Beverage { public abstract String getDesc(); }2个被装饰类:被装饰类基础最上层的饮料抽象类
package cn.beverage.demo; /** * 被装饰的类 * * @author wy * */ public class Espresso extends Beverage { public Espresso() { this.desc = "濃縮咖啡"; } @Override public double cost() { // TODO Auto-generated method stub return 1.99; } }
package cn.beverage.demo; /** * 被装饰的类 * * @author wy * */ public class HouseBlend extends Beverage { public HouseBlend() { this.desc = "首选咖啡"; } @Override public double cost() { // TODO Auto-generated method stub return 0.89; } }
再添加两个装饰者:
package cn.beverage.demo; /** * 裝飾者 * * @author wy * */ public class Mocha extends Condiment { private Beverage beverage; public Mocha(Beverage beverage) { this.beverage = beverage; } @Override public String getDesc() { // TODO Auto-generated method stub return beverage.getDesc() + ",摩卡"; } @Override public double cost() { // TODO Auto-generated method stub return 0.20 + beverage.cost(); } }
package cn.beverage.demo; /** * 裝飾者 * * @author wy * */ public class Whip extends Condiment { private Beverage beverage; public Whip(Beverage beverage) { this.beverage = beverage; } @Override public String getDesc() { // TODO Auto-generated method stub return beverage.getDesc() + ",whip "; } @Override public double cost() { // TODO Auto-generated method stub return 10 + beverage.cost(); } }测试方法:
package cn.beverage.demo; public class Test { public static void main(String[] args) { Beverage beverage = new Espresso(); beverage = new Mocha(beverage); System.out.println(beverage.getDesc() + " : " + beverage.cost()); Beverage beverage2 = new HouseBlend(); //用摩卡装饰beverage2 beverage2 = new Mocha(beverage2); System.out.println(beverage2.getDesc() + " : " + beverage2.cost()); Beverage beverage3 = new Espresso(); //用摩卡装饰beverage3 beverage3 = new Mocha(beverage3); //再用whip装饰beverage3 beverage3 = new Whip(beverage3); System.out.println(beverage3.getDesc() + " : " + beverage3.cost()); } }
输出结果:
濃縮咖啡,摩卡 : 2.19 首选咖啡,摩卡 : 1.09 濃縮咖啡,摩卡,whip : 12.19