设计模式——装饰者模式
来源:互联网 发布:淘宝卖的dnf辅助 编辑:程序博客网 时间:2024/05/03 16:39
装饰者模式:
首先定义抽象的组件类,子类继承该类后持有抽象类的引用,在抽象类的基础上可以在调用父类方法前后分别执行自己的行为。从而实现装饰添加新的功能特性。再次强调了使用组合的好处。
强调对扩展开放,对修改关闭。
在Java I/O中应用了装饰者模式。
2.实现三种不同种类的饮料
3.定义添加了调料的饮料抽象类
4.实现不同调料的饮料
可以看到不同种类的饮料得出了不同的价格。
首先定义抽象的组件类,子类继承该类后持有抽象类的引用,在抽象类的基础上可以在调用父类方法前后分别执行自己的行为。从而实现装饰添加新的功能特性。再次强调了使用组合的好处。
强调对扩展开放,对修改关闭。
在Java I/O中应用了装饰者模式。
装饰者模式类图:
以下程序来自Head First设计模式中的实例代码,模拟了不同种类的饮料不同的售价计算方法。
1.定义饮料接口
package net.dp.decorator; public abstract class Beverage { protected String description = "Unknown Beverage"; public String getDescription() { return description; } public abstract double cost();}
2.实现三种不同种类的饮料
package net.dp.decorator.coffee; import net.dp.decorator.Beverage; public class Espresso extends Beverage { public Espresso() { description = "Espresso"; } public double cost() { return 1.99; }}
package net.dp.decorator; public abstract class Beverage { protected String description = "Unknown Beverage"; public String getDescription() { return description; } public abstract double cost();}
package net.dp.decorator.coffee; import net.dp.decorator.Beverage; public class HouseBlend extends Beverage { public HouseBlend() { description = "House Blend Coffee"; } public double cost() { return .89; }}
3.定义添加了调料的饮料抽象类
package net.dp.decorator; public abstract class CondimentDecorator extends Beverage { public abstract String getDescription();}
4.实现不同调料的饮料
package net.dp.decorator.flovoring; import net.dp.decorator.Beverage;import net.dp.decorator.CondimentDecorator; 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(); }}
package net.dp.decorator.flovoring; import net.dp.decorator.Beverage;import net.dp.decorator.CondimentDecorator; public class Soy extends CondimentDecorator { Beverage beverage; public Soy(Beverage beverage) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Soy"; } public double cost() { return .15 + beverage.cost(); }}
package net.dp.decorator.flovoring; import net.dp.decorator.Beverage;import net.dp.decorator.CondimentDecorator; public class Whip extends CondimentDecorator { Beverage beverage; public Whip(Beverage beverage) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Whip"; } public double cost() { return .10 + beverage.cost(); }}5.终于大功告成!跑一把!
package net.dp.decorator; import net.dp.decorator.coffee.DarkRoast;import net.dp.decorator.coffee.Espresso;import net.dp.decorator.coffee.HouseBlend;import net.dp.decorator.flovoring.Mocha;import net.dp.decorator.flovoring.Soy;import net.dp.decorator.flovoring.Whip; public class StarbuzzCoffee { public static void main(String[] args) { Beverage beverage = new Espresso(); System.out.println(beverage.getDescription() + " $" + beverage.cost()); Beverage beverage2 = new DarkRoast(); beverage2 = new Mocha(beverage2); beverage2 = new Mocha(beverage2); beverage2 = new Whip(beverage2); System.out .println(beverage2.getDescription() + " $" + beverage2.cost()); Beverage beverage3 = new HouseBlend(); beverage3 = new Soy(beverage2); beverage3 = new Mocha(beverage2); beverage3 = new Whip(beverage2); System.out .println(beverage3.getDescription() + " $" + beverage3.cost()); }}
可以看到不同种类的饮料得出了不同的价格。
0 0
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 【设计模式】——装饰者模式
- Maven内置变量
- myeclipse点击部署项目没有反应的解决办法
- 看到许多网站的几秒注册
- android<application>标签概述
- DB2 HADR 性能调优及 HADR 模拟器
- 设计模式——装饰者模式
- android xml parse
- 阻塞与非阻塞
- DB2 Linux, Unix and Windows HADR Simulator use case and troubleshooting guid
- bzoj 1798 段乘段加线段树 双懒标记
- 使用keepalived 实现redis主从高可用
- App Store审核指南中文版(2014.10.11更新)
- 【基础篇系列3】java之面向对象
- java事务