装饰者模式(Decorator)

  ——动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

  • 特点:建立拥有共同超类的装饰者与被装饰者来实现功能的动态扩展
  • 原则:对扩展开放,对修改关闭。(开放-关闭原则)
  • 示例:(装饰饮料类图)包括 抽象组件(Beverage),具体组件(HouseBlend),抽象装饰者(CondimentDecorator)和具体装饰者(Mocha)

Beverage.java

 public abstract class Beverage {
String description = "Unknown Beverage";//定义饮料相关描述信息
float cost;//定义饮料的价格 public abstract double getCost();//定义cost方法返回该饮料的价格,子类必须实现此方法 public String getDescription(){
return description;
}
}

CondimentDecorator.java

 public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}

HouseBlend.java

 public class HouseBlend extends Beverage{
public HouseBlend(){
description = "House Blend Coffee";
}
public double cost(){
return 1.99;
}
}

Mocha.java

 public class Mocha extends CondimentDecorator{
Beverage beverage;//被装饰者
public Mocha(Beverage beverage)
{
this.beverage = beverage;
}
public String getDescription(){
return beverage.getDescription()+", Mocha";//利用委托(delegate),得到一个description。
}
public double cost(){
return .20 + beverage.cost();
}
}

Test.java

 public class Test{
public static void main(String args[]){
Beverage beverage = new HouseBlend();//调料为豆浆、双摩卡、奶泡的HouseBlend咖啡
beverage = new Soy(beverage);
beverage = new Mocha(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
System.out.println(beverage.getDescription() + " $" + beverage.cost());
}
}

notice:

  1. 装饰者和被装饰者必须是一样的类型,也就是有共同的超类,用继承达到“类型匹配”。
  2. 通常装饰者模式是采用抽象类,但在Java中可以使用接口。
  3. 可以用无数个装饰者包装一个组件。

缺点:

装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。


附:装饰 java.io 类

InputStream in = new BufferedInputStream(new FileInputStream("test.txt"));

最新文章

  1. kafka模块概述
  2. 特征处理(Feature Processing)
  3. [转]WPF/MVVM快速开始手册
  4. java中图片文件的判断
  5. 获取、增加、修改、删除sqlserver字段描述
  6. mysql概要(七)表字段管理,字段的增删改
  7. 提高SQL语句的性能
  8. 利用绝对定位与margin实现元素居中
  9. 关于Tarjan(3)——离线LCA
  10. 【2017-05-21】WebForm跨页面传值取值、C#服务端跳转页面、 Button的OnClientClick属性、Js中getAttribute和超链接点击弹出警示框。
  11. java中自动装箱带来的性能问题
  12. MySQL5.7新特性:lossless replication 无损复制
  13. CTF---Web入门第三题 这个看起来有点简单!
  14. .NET Core 学习笔记2——管理nuget包
  15. [USACO5.3]校园网Network of Schools
  16. 利用Oracle分析函数row_number和sys_connect_by_path实现多行数据合并为一行
  17. jquery中Get方法请求接口
  18. lecune入门示例
  19. js对象深拷贝与浅拷贝
  20. 使用http-server创建本地服务

热门文章

  1. 2017清北学堂(提高组精英班)集训笔记——动态规划Part3
  2. 机器学习前沿热点——Deep Learning
  3. 项目一:第五天 1、区域数据(pinyin4j-简码,城市编码) 2、Web层代码重构(model对象,分页代码提取) 3、区域分页查询 3、分区添加功能 4、定区管理管理-添加,分页
  4. p1516&poj1061&bzoj1477 青蛙的约会
  5. p2023&bzoj1798 维护序列
  6. 9、scala函数式编程-集合操作
  7. IDEA拷贝git上的最新项目资源
  8. Firefox 网页 光标 闪烁
  9. SQL语言 持续更新中……
  10. Codeforces 92C【二分】