Head First 设计模式(中文版) 读书笔记
先说下装饰器模式要解决的问题:能够使咱们在不修改任何底层代码的状况下,给你的对象赋予新的职责,也就是在不改变原有对象的前提下增长行为
,知足开闭原则
,java
开闭原则:对扩展开放,对修改关闭!
定义:git
装饰器模式是动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
00原则:github
1. 封装变化 2. 多用组合,少用继承 3. 针对接口变成,不针对实现编程 4. 为交互对象直接的松耦合 5. 对扩张开放,对修改关闭
优势:编程
1. 动态的 2. 提供了有别于继承的另外一种选择 3. 符合开闭原则 4. 能够搭配其余模式,如工厂模式和生成器模式等
缺点:设计模式
1. 装饰器模式,经常形成设计中有大量的小类
类图:ide
举例描述:学习
装饰器就相似于一个一个的包装器,将被装饰对象包装起来,开局就是一个猴,只不过是从石头缝蹦出来的,在后去蓬莱仙岛学习仙术,学习到了72般变化和精斗云称为孙行者,以后闯龙宫,闹天空,吃仙丹称为了齐天大圣......,每个角色都是对上一个角色的装饰,最原始的对象就是个可爱的小猴,称为被装饰对象。
主要实现代码:this
/** * 顶级抽象类 * @author slxsm * @date 2020-05-11 */ public abstract class Beverage { String description = "Unknown Beverage"; public String getDescription(){ return description; } public abstract double cost(); }
/** *装饰者类->调料 * @author slxsm * @date 2020-05-11 */ public abstract class CondimentDecorator extends Beverage{ public abstract String getDescription(); }
/** *被装饰类->浓缩咖啡 * @author slxsm * @date 2020-05-11 */ public class Espresso extends Beverage { public Espresso(){ description = "Espresso"; } @Override public double cost() { return 1.99; } }
/** * 调料->摩卡 * @author slxsm * @date 2020-05-12 */ public class Mocha extends CondimentDecorator{ Beverage beverage; public Mocha(Beverage beverage){ this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ", Mocha"; } @Override public double cost() { return .20 + beverage.cost(); } }
/** * 调料 * @author slxsm * @date 2020-05-12 */ public class Whip extends CondimentDecorator { Beverage beverage; public Whip(Beverage beverage){ this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ", whip"; } @Override public double cost() { return .02 + beverage.cost(); } }
/** * 客户端 * @author slxsm * @date 2020-05-12 */ public class StarbuzzCoffee { public static void main(String[] args) { Beverage beverage = new Espresso(); System.out.println(beverage.getDescription() + " $" + beverage.cost()); Beverage beverage1 = new DarkRoast(); beverage1 = new Mocha(beverage1); beverage1 = new Mocha(beverage1); beverage1 = new Whip(beverage1); System.out.println(beverage1.getDescription() + " $" + beverage1.cost()); } }
//运行结果 Espresso $1.99 DarkRoast, Mocha, Mocha, whip $1.3
书中指出jdk~inputStream
类使用了装饰器模式,类关系以下:spa
示例代码地址:装饰器模式Github地址设计