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

来源:互联网 发布:网络直播的研究意义 编辑:程序博客网 时间:2024/06/11 00:42
"我曾经以为男子汉应该用继承处理一切,后来我领教到运行时扩展,远比编译时期的继承威力大。"
利用组合(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";}@Overridepublic double cost() {return 1.99;}}


package cn.partner4java.decorator;/** *  * @author partner4java * */public class HouseBlend extends Beverage {public HouseBlend(){description = "House Blend Coffee";}@Overridepublic 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;}@Overridepublic String getDescription() {return beverage.getDescription() + ",Mocha";}@Overridepublic 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;}@Overridepublic String getDescription() {return beverage.getDescription() + ",Whip";}@Overridepublic 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());}}








原创粉丝点击