`
lovnet
  • 浏览: 6705319 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

head first 装饰者模式 -- 借助继承

 
阅读更多
"我曾经以为男子汉应该用继承处理一切,后来我领教到运行时扩展,远比编译时期的继承威力大。"
利用组合(composition)和委托(delegation)可以在运行时具有继承行为的结果。
利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然后,
如果能够组合的做法扩展对象的行为,就可以在运行时动态的进行扩展。


代码应该如同晚霞中的莲花一样的关闭(免于改变),如何晨曦中的莲花一样的开放(能够扩展)。


类应该对扩展开放,对修改关闭。


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


装饰者和被装饰者必须是一样的类型,也就是有共同的超类,这就是相当关键的地方。
在这里,我们利用继承达到“类型匹配”,而不是利用继承获得“行为”。


当我们将装饰者与组件组合时,就是在加入新的行为,所得到的薪行为,并不是继承自超类,而是有组合对象的来的。


看demo玩的很happy,感觉也只有这种业务场景能够用到了。也就是一些东西会重复和累加使用,
而且重复累加使用的特性在父类是完成不了的。那么就需要各个子类去完成自己的东西,最后累加到一起。


调料其实不是真实饮料的子类,调料只是为了能够覆盖饮料,把自己加进去。
也就是借助继承。


package cn.partner4java.decorator;


/**
 * 饮料,原始的饮料基础类
 * @author partner4java
 *
 */
public abstract class Beverage {
	String description = "Unknown Beverage";

	public String getDescription() {
		return description;
	}
	
	public abstract double cost();
}

package cn.partner4java.decorator;


/**
 * 调料抽象类 -- 实现它来增加调料
 * @author partner4java
 *
 */
public abstract class CondimentDecorator extends Beverage {
	public abstract String getDescription();
}


package cn.partner4java.decorator;


/**
 * 
 * @author partner4java
 *
 */
public class Espresso extends Beverage {

	public Espresso(){
		description = "Espresso";
	}
	
	@Override
	public double cost() {
		return 1.99;
	}

}


package cn.partner4java.decorator;


/**
 * 
 * @author partner4java
 *
 */
public class HouseBlend extends Beverage {

	public HouseBlend(){
		description = "House Blend Coffee";
	}
	
	@Override
	public double cost() {
		return .89;
	}

}


package cn.partner4java.decorator;


/**
 * 加入摩卡这个装饰者
 * @author partner4java
 *
 */
public class Mocha extends CondimentDecorator {
	/** 被装饰者 */
	Beverage beverage;
	
	/**
	 * 强制进来一个被装饰者
	 * @param beverage 被装饰者
	 */
	public Mocha(Beverage beverage){
		this.beverage = beverage;
	}
	

	@Override
	public String getDescription() {
		return beverage.getDescription() + ",Mocha";
	}

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

}


package cn.partner4java.decorator;


/**
 * 加入奶泡这个装饰者
 * @author partner4java
 *
 */
public class Whip extends CondimentDecorator {
	/** 被装饰者 */
	Beverage beverage;
	
	/**
	 * 强制进来一个被装饰者
	 * @param beverage 被装饰者
	 */
	public Whip(Beverage beverage){
		this.beverage = beverage;
	}
	
	@Override
	public String getDescription() {
		return beverage.getDescription() + ",Whip";
	}

	@Override
	public double cost() {
		return .10 + beverage.cost();
	}

}



package cn.partner4java.decorator.test;

import cn.partner4java.decorator.Beverage;
import cn.partner4java.decorator.Espresso;
import cn.partner4java.decorator.HouseBlend;
import cn.partner4java.decorator.Mocha;
import cn.partner4java.decorator.Whip;


/**
 * 测试装饰者模式
 * @author partner4java
 *
 */
public class TestDecorator {

	public static void main(String[] args) {
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() + " {1}quot; + beverage.cost());
		
		Beverage beverage2 = new HouseBlend();
		beverage2 = new Mocha(beverage2);
		beverage2 = new Whip(beverage2);
		System.out.println(beverage2.getDescription() + " {1}quot; + beverage2.cost());
	}

}








分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics