设计模式三(装饰者模式)

设计原则1:类的设计应该对拓展开放,对修改关闭,这个设计原则的目标就是要使得在不修改现有代码的情况下可以搭配新的行为。

装饰着模式:动态地将责任附加到对象上。若要拓展功能,装饰者提供了比继承更加有弹性的替代方案。类图如下:
设计模式三(装饰者模式)
注:ConcreteComponent是我们将要动态的加上新行为的对象;
ConcreteDecorator有一个实例变量可以记录所装饰的事物,装饰者还可以增加新的方法或者状态

1、装饰者和被装饰者对象具有相同的超类;
2、可以用一个或者多个装饰者对包装一个对象;
3、在任何需要使用被装饰者的时候,都可以使用装饰过的对象替代它;
4、装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
5、对象可以在任何时候被装饰。

//饮料的抽象类,相当于Component类
public abstract class Beverage {
	String description="Unknow Beverage ";
	public String  getDescription(){
		return description;
	}
	public abstract double cost();
}

//具体的饮料1:浓缩咖啡 相当于ConcreteComponent
public class Espresso extends Beverage{
	
	public  Espresso() {
		description="Espresso";
	}
	
	public double cost(){//单杯咖啡的价格
		return 1.99;
	}

}
public class HouseBlend extends Beverage {

	/**
	 * 另一种咖啡
	 */
	public HouseBlend() {
		// TODO Auto-generated constructor stub
		description="HouseBlend";
	}
	
	public double cost(){
		return 0.89;
	}
}
public abstract class CondimentDecorator extends Beverage {
	//相当于装饰者的抽象类
	public abstract String getDescription();
	//所有的调料装饰者都必须实现该方法
}

public class Mocha  extends CondimentDecorator{

	//摩卡是一个具体的装饰者
	Beverage beverage;
	public Mocha(Beverage beverage) {
		this.beverage=beverage;
	}
	
	public String getDescription() {
		return beverage.getDescription()+", Morcha";
	}
	
	public double cost(){
		return 0.20+beverage.cost();
	}
}
public class Soy  extends CondimentDecorator{

	//摩卡是一个具体的装饰者
	Beverage beverage;
	public Soy(Beverage beverage) {
		this.beverage=beverage;
	}
	
	public String getDescription() {
		return beverage.getDescription()+", Soy";
	}
	
	public double cost(){
		return 0.90+beverage.cost();
	}
}


/*
		 * 装饰者模式测试
		 * */
		
		Beverage beverage=new Espresso();
		System.out.println(beverage.getDescription()+" $"+beverage.cost());
		
		Beverage beverage2=new HouseBlend();
		//给它添加各种调料
		beverage2=new Mocha(beverage2);
		beverage2=new Soy(beverage2);
		beverage2=new Mocha(beverage2);
		
		System.out.println(beverage2.getDescription()+" $"+beverage2.cost());

你可能感兴趣的:(设计模式三(装饰者模式))