一:用headFirst 设计模式--咖啡例子:
1.*----装饰者模式----
* 1. 动态地将责任附加到对象上
* 1.1 : 以饮料为主体,然后在运行时以调料来 ‘装饰’ 饮料
*
* 2. 装饰者与被装饰者间必须要有共同超类
* 2.1 : 并非用继承获得行为,而是组合对象而来,并且由运行时决定
*
* 3. 通常装饰者模式采用抽象类
* 4. 利用实例变量 "委托" 得到装饰
*
*
2. 装饰者模式基本图
3. 作用于--饮料类
package com.xjj.Decorator_3;
//抽象超类--组件类
public abstract class Beverage {
//饮料名字
public String description = "未命名.";
public String getDescription() {
return description;
}
//价钱,由其子类实现
public abstract double cost();
}
package com.xjj.Decorator_3;
//被装饰者具体实现
public class HouseBlend extends Beverage {
//继承而来
public HouseBlend() {
description = "综合咖啡";
}
@Override
public double cost() {
return 0.89;
}
}
package com.xjj.Decorator_3;
//被装饰者具体实现
public class Espresso extends Beverage {
//继承而来
public Espresso() {
description = "浓咖啡";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 1.99;
}
}
package com.xjj.Decorator_3;
//装饰者抽象超类
public abstract class CondimentDecorator extends Beverage {
//所有装饰者类必须重新实现该方法?
public abstract String getDescription();
}
package com.xjj.Decorator_3;
//具体装饰者--加牛奶
//继承(扩展抽象类-调味装饰者)
public class Milk extends CondimentDecorator {
//实例变量,保存记录被装饰者(何种饮料)
Beverage beverage;
//利用构造函数记录--具有共同超类
public Milk(Beverage beverage) {
this.beverage = beverage;
}
//利用委托的做法得到装饰
@Override
public String getDescription() {
return beverage.getDescription() + "+牛奶.";
}
@Override
public double cost() {
return beverage.cost() + 0.2;
}
}
package com.xjj.Decorator_3;
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + "+摩卡.";
}
@Override
public double cost() {
return beverage.cost() + 0.15;
}
}
package com.xjj.Decorator_3;
//针对超类型编程
public class Main {
public static void main(String[] args) {
//新点(建)咖啡
Beverage houseBlend = new HouseBlend();
System.out.println("点咖啡: " + houseBlend.getDescription());
System.out.println("价钱为: " + houseBlend.cost());
//针对超类编程,实现多态
System.out.println();
Beverage houseBlend_m = new HouseBlend();
//加咖啡(装饰者),此处有向上转型
houseBlend_m = new Milk(houseBlend_m);
System.out.println("点咖啡: " + houseBlend_m.getDescription());
System.out.println("价钱为: " + houseBlend_m.cost());
System.out.println();
Beverage espresso = new Espresso();
espresso = new Mocha(espresso);
System.out.println("点咖啡: " + espresso.getDescription());
System.out.println("价钱为: " + espresso.cost());
}
}