设计模式三:装饰者模式

装饰者模式动态地将责任附加到对象上。如要扩展功能,装饰者提供了比继承更有弹性的替代方案。java

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

抽象组件Component :测试

Beverage类(能够是接口也能够是抽象类)this

package com.sun;

public abstract class Beverage {
	String description = "Unknow Beverage";
	public String getDescription(){
		return description;
	}
	public abstract double cost();
}

具体组件ConcreteComponent:具体组件扩展自 Beverage类设计

DarkRost类code

package com.sun;

public class DarkRost extends Beverage {
	
	public DarkRost(){
		description = "this is DarkRost";
	}
	public double cost() {
		return 0.88;
	}

}

Espresso类对象

package com.sun;

public class Espresso extends Beverage{
	public Espresso(){
		description = "Espresso";
	}
	public double cost(){
		return 1.99;
	}
}

HouseBlend类继承

package com.sun;

public class HouseBlend extends Beverage {
	
	public HouseBlend(){
		description = "House Blend Coffee";
	}
	public double cost() {
		return .89;
	}

}

 

抽象装饰者Decorator: 必须让 抽象装饰者可以取代Beverage,因此将抽象装饰者扩展自Beverage类接口

CondimentDecorator类ip

package com.sun;

public abstract class CondimentDecorator extends Beverage{
	public abstract String getDescription();
}

具体装饰者:

Mocha类

package com.sun;

public class Mocha extends CondimentDecorator {
	
	Beverage beverage;
	
	public Mocha(Beverage beverage){
		this.beverage = beverage;
	}
	public String getDescription() {
               /*由于Beverage对象已经被装饰过,因此这里不仅是想描述被装饰者(例如DarkRost),而是连同装饰者都描述出来(例如“DarkRoast,Mocha”。因此首先利用委托的作法,获得一个叙述,而后在其后加上附加的叙述。*/
		return beverage.getDescription() +",Mocha";
	}

	public double cost() {
		return .20 + beverage.cost();
	}

}

Whip类

package com.sun;

public class Whip extends Beverage {
	Beverage beverage;
	public Whip(Beverage beverage){
		this.beverage = beverage;
	}
	
	public String getDescription(){
		return beverage.getDescription() + ", Whip";
	}
	public double cost() {
		return 0.22 + beverage.cost();
	}

}

测试类:StarbuzzCoffee

package com.sun;

public class StarbuzzCoffee {
	public static void main(String[] args) {
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription()+"$" + beverage.cost());
		
		Beverage beverage2 = new DarkRost();
 	beverage2 = new Mocha(beverage2); //用Mocha装饰DarkRost对象
		beverage2 = new Whip(beverage2); //用第二个Mocha装饰DarkRost对象
		System.out.println(beverage2.getDescription()+"$" + beverage2.cost());
		
		Beverage beverage3 = new HouseBlend();
		beverage3 = new Whip(beverage3); //用Whip装饰HouseBlend对象
		beverage3 = new Mocha(beverage3); //用Mocha装饰HouseBlend对象
		System.out.println(beverage3.getDescription() + "$" +beverage3.cost());
	} 
}

测试结果:

Espresso$1.99
this is DarkRost,Mocha, Whip$1.3
House Blend Coffee, Whip,Mocha$1.31

能够利用工厂和生成器设计模式,能以更好的方式创建被装饰者对象。

相关文章
相关标签/搜索