【HeadFirst设计模式】装饰者模式

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


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

我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为。这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求。


类图


ConcreteComponent是我们要动态地加上新行为的对象,它扩展自Component。

每个装饰者都“有一个”(包装一个)组件,也就是说,装饰者有一个实例变量以保存某个Component的引用。


Beverage.java

/**
 *Beverage(Component)是一个抽象类,有两个方法:getDescription()及cost()
 */
package headfirst.decorator.starbuzz;

public abstract class Beverage {
	String description = "Unknown Beverage";

	//getDescription()已在此实现,而cost需在子类中实现
	public String getDescription() {
		return description;
	}
 
	public abstract double cost();
}

CondimentDecorator.java

/**
 *必须让Condiment Decorator能取代Beverage,所以CondimentDecorator扩展自Beverage类
 */
package headfirst.decorator.starbuzz;

public abstract class CondimentDecorator extends Beverage {
	//所有调料装饰者必须重新实现getDescription()
	public abstract String getDescription();
}

Espresso.java

/**
 *ConcreteComponent扩展自Beverage
 */
package headfirst.decorator.starbuzz;

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

Mocha.java

/*
 *ConcreteDecorator继承自CondimentDecorator,而CondimentDecorator扩展自Beverage
 */
package headfirst.decorator.starbuzz;

public class Mocha extends CondimentDecorator {
	//用一个实例变量记录饮料,即被装饰者
	Beverage beverage;
 
	public Mocha(Beverage beverage) {
		this.beverage = beverage;
	}
 
	public String getDescription() {
		return beverage.getDescription() + ", Mocha";
	}
 
	public double cost() {
		return .20 + beverage.cost();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值