head first 装饰者模式 -- 借助继承
来源:互联网 发布:网络直播的研究意义 编辑:程序博客网 时间:2024/06/11 00:42
"我曾经以为男子汉应该用继承处理一切,后来我领教到运行时扩展,远比编译时期的继承威力大。"
利用组合(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";}@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());}}
- head first 装饰者模式 -- 借助继承
- Head First装饰者模式
- Head First: 装饰者模式
- Head First---装饰者模式
- Head First 装饰者模式
- Head First 装饰模式
- Head First设计模式-装饰者模式
- 《Head First 设计模式》装饰者模式
- Head First 设计模式--装饰者模式
- Head First-设计模式:装饰者模式
- Head first笔记三:装饰者模式
- 《Head First-Chapter3》装饰者模式
- Head First设计模式:(三)装饰者模式
- Head First Java 设计模式——装饰者模式
- Head First 设计模式(3)- 装饰者模式 笔记
- Head First设计模式之观察者,装饰者模式
- 《Head First 设计模式》之装饰者模式
- 《Head First 设计模式》读书笔记之装饰者模式
- Android手机开发:Menu功能
- Oracle外连接和内连接
- Jquery键盘事件处理插件及DEMO
- java中实践格式化
- C和C++混合编程(__cplusplus 与 external "c" 的使用)
- head first 装饰者模式 -- 借助继承
- 使用 ipmitool 实现 Linux 系统下对服务器的 ipmi 管理
- 诺基亚技术支持提供的 qml json 交互
- Java软件低级错误(十 五):大小写转换的正确处理
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
- Java软件低级错误(十 四):定义equals方法的同时也要定义hashCode方法
- 晒晒我的编辑器
- C类地址子网、主机、广播地址等子网掩码的相关的计算
- 如何当好IT讲师