Head First 设计模式(中文版) 读书笔记
先说下装饰器模式要解决的问题:可以使我们在不修改任何底层代码的情况下,给你的对象赋予新的职责,也就是在不改变原有对象的前提下增加行为
,满足开闭原则
,
开闭原则:对扩展开放,对修改关闭!
定义:
装饰器模式是动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
00原则:
1. 封装变化
2. 多用组合,少用继承
3. 针对接口变成,不针对实现编程
4. 为交互对象直接的松耦合
5. 对扩张开放,对修改关闭
优点:
1. 动态的
2. 提供了有别于继承的另一种选择
3. 符合开闭原则
4. 可以搭配其他模式,如工厂模式和生成器模式等
缺点:
1. 装饰器模式,常常造成设计中有大量的小类
类图:
举例描述:
装饰器就类似于一个一个的包装器,将被装饰对象包装起来,开局就是一个猴,只不过是从石头缝蹦出来的,在后去蓬莱仙岛学习仙术,学习到了72般变化和精斗云称为孙行者,之后闯龙宫,闹天空,吃仙丹称为了齐天大圣......,每一个角色都是对上一个角色的装饰,最原始的对象就是个可爱的小猴,称为被装饰对象。
主要实现代码:
/**
* 顶级抽象类
* @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
类使用了装饰器模式,类关系如下:
示例代码地址:装饰器模式Github地址
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。