装饰者模式(Decorator Pattern)
来源:互联网 发布:mac air连接电视 编辑:程序博客网 时间:2024/06/05 19:16
设计原理5:类应该对扩展开放,对修改关闭
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案
案例,根据《Head First》的例子,写一个茶与调味料- 糖和牛奶的例子:
斜体文字的为虚类或虚函数。
代码实现:
public class PatternDemo {public static void main(String[] args) {Tea tea = new Tea();System.out.println(tea.getDescription() + ", $" + tea.getCost());Beverage beverage = new Milk(tea);Beverage beverage1 = new Sugar(tea);System.out.println(beverage.getDescription() + ", $" + beverage.getCost());System.out.println(beverage1.getDescription() + ", $" + beverage1.getCost());beverage = new Sugar(beverage);System.out.println(beverage.getDescription() + ", $" + beverage.getCost());}}
public abstract class Beverage {private String description;public Beverage() {}public Beverage(String description) {this.description = description;}public String getDescription() {return description;}public abstract double getCost();}
public abstract class CondimentDecorator extends Beverage {public abstract String getDescription(); }
其实这个抽象方法写起来应该只是为了强制性在子类里要开发者实现,如果不写,可以在子类里直接重载Beverage里的方法也可以
public class Tea extends Beverage {public Tea() {super("Tea");}public Tea(String description) {super(description);}@Overridepublic double getCost() {return 2;}}
public class Milk extends CondimentDecorator {private Beverage beverage;public Milk(Beverage beverage) {this.beverage = beverage;}@Overridepublic String getDescription() {return beverage.getDescription() + " with milk";}@Overridepublic double getCost() {return beverage.getCost() + 0.5;}}
public class Sugar extends CondimentDecorator {private Beverage beverage;public Sugar(Beverage beverage) {this.beverage = beverage;}@Overridepublic String getDescription() {return beverage.getDescription() + " with sugar";}@Overridepublic double getCost() {return beverage.getCost() + 0.3;}}
《Head First》后面提到,原来JDK里的InputStream和OutputStream都是用装饰者模式完成的,这样就好理解多了:
InputStream就是最上层的抽象基类,而FilterInputStream就是继承抽象基类InputStream的装饰者抽象基类
- 装饰者模式(the Decorator Pattern)
- 装饰者模式(Decorator Pattern)
- 装饰者模式(Decorator Pattern)
- 装饰者模式(Decorator Pattern)
- 装饰者模式(Decorator Pattern)
- Decorator Pattern 装饰者模式(二)
- 装饰者模式(Decorator Pattern)
- 装饰者模式(Decorator Pattern)
- 装饰者模式(Decorator Pattern)
- 装饰者模式(Decorator Pattern)
- 3.装饰者模式(Decorator Pattern)
- 装饰者模式(Decorator Pattern)
- Decorator Pattern (装饰者模式)
- 装饰者模式(Decorator Pattern)
- 装饰者模式(decorator pattern)
- 装饰者模式(Decorator Pattern)
- 装饰者模式(Decorator Pattern)
- Decorator Pattern 装饰者模式
- MySQL常用函数
- Facebook : Corona的Reduce延时启动
- String,StringBuffer,StringBuilder的区别?
- C++个人笔记二
- 正则表达式30分钟入门教程
- 装饰者模式(Decorator Pattern)
- [架构] ZeroMQ 深度探索(二)
- Delphi Locate 详解1
- mysql常用技巧汇总
- keepalived 添加pop3_check模块(一)
- C的字符串指针排序
- MongoDB C# 驱动教程
- 泊松分酒(泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。 有一次闲暇时,他提出过一个有趣的问题,后称为:)
- keepalived 添加pop3_check模块(二)