设计模式--装饰者模式_1

一:用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());
		
		
	}

}


猜你喜欢

转载自blog.csdn.net/jiejiexiao/article/details/79902375