"我曾经以为男子汉应该用继承处理一切,后来我领教到运行时扩展,远比编译时期的继承威力大。"
利用组合(composition)和委托(delegation)可以在运行时具有继承行为的结果。
利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然后,
如果能够组合的做法扩展对象的行为,就可以在运行时动态的进行扩展。
代码应该如同晚霞中的莲花一样的关闭(免于改变),如何晨曦中的莲花一样的开放(能够扩展)。
类应该对扩展开放,对修改关闭。
装饰着模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
装饰者和被装饰者必须是一样的类型,也就是有共同的超类,这就是相当关键的地方。
在这里,我们利用继承达到“类型匹配”,而不是利用继承获得“行为”。
利用组合(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());
}
}