设计模式三:装饰者模式

本文深入探讨了装饰者模式的应用及其实现方式,通过具体的Java代码示例解释了如何使用装饰者模式来为对象动态添加职责,同时保持高度的灵活性。

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

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

抽象组件Component :

Beverage类(可以是接口也可以是抽象类)

package com.sun;

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

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

DarkRost类

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类

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

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

转载于:https://my.oschina.net/u/3723612/blog/1615149

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值