《Head First 设计模式》之装饰者模式——饮料加工
2024-09-06 12:56:14
装饰者模式(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:
- 装饰者和被装饰者必须是一样的类型,也就是有共同的超类,用继承达到“类型匹配”。
- 通常装饰者模式是采用抽象类,但在Java中可以使用接口。
- 可以用无数个装饰者包装一个组件。
缺点:
装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。
附:装饰 java.io 类
InputStream in = new BufferedInputStream(new FileInputStream("test.txt"));
最新文章
- kafka模块概述
- 特征处理(Feature Processing)
- [转]WPF/MVVM快速开始手册
- java中图片文件的判断
- 获取、增加、修改、删除sqlserver字段描述
- mysql概要(七)表字段管理,字段的增删改
- 提高SQL语句的性能
- 利用绝对定位与margin实现元素居中
- 关于Tarjan(3)——离线LCA
- 【2017-05-21】WebForm跨页面传值取值、C#服务端跳转页面、 Button的OnClientClick属性、Js中getAttribute和超链接点击弹出警示框。
- java中自动装箱带来的性能问题
- MySQL5.7新特性:lossless replication 无损复制
- CTF---Web入门第三题 这个看起来有点简单!
- .NET Core 学习笔记2——管理nuget包
- [USACO5.3]校园网Network of Schools
- 利用Oracle分析函数row_number和sys_connect_by_path实现多行数据合并为一行
- jquery中Get方法请求接口
- lecune入门示例
- js对象深拷贝与浅拷贝
- 使用http-server创建本地服务
热门文章
- 2017清北学堂(提高组精英班)集训笔记——动态规划Part3
- 机器学习前沿热点——Deep Learning
- 项目一:第五天 1、区域数据(pinyin4j-简码,城市编码) 2、Web层代码重构(model对象,分页代码提取) 3、区域分页查询 3、分区添加功能 4、定区管理管理-添加,分页
- p1516&;poj1061&;bzoj1477 青蛙的约会
- p2023&;bzoj1798 维护序列
- 9、scala函数式编程-集合操作
- IDEA拷贝git上的最新项目资源
- Firefox 网页 光标 闪烁
- SQL语言 持续更新中……
- Codeforces 92C【二分】