设计模式-装饰器模式

Head First 设计模式(中文版) 读书笔记

先说下装饰器模式要解决的问题:能够使咱们在不修改任何底层代码的状况下,给你的对象赋予新的职责,也就是在不改变原有对象的前提下增长行为,知足开闭原则java

开闭原则:对扩展开放,对修改关闭!

定义:git

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

00原则:github

1. 封装变化
2. 多用组合,少用继承
3. 针对接口变成,不针对实现编程
4. 为交互对象直接的松耦合
5. 对扩张开放,对修改关闭

优势:编程

1. 动态的
2. 提供了有别于继承的另外一种选择
3. 符合开闭原则
4. 能够搭配其余模式,如工厂模式和生成器模式等

缺点:设计模式

1. 装饰器模式,经常形成设计中有大量的小类

类图:
装饰器类图ide

举例描述:学习

装饰器就相似于一个一个的包装器,将被装饰对象包装起来,开局就是一个猴,只不过是从石头缝蹦出来的,在后去蓬莱仙岛学习仙术,学习到了72般变化和精斗云称为孙行者,以后闯龙宫,闹天空,吃仙丹称为了齐天大圣......,每个角色都是对上一个角色的装饰,最原始的对象就是个可爱的小猴,称为被装饰对象。

image.png

主要实现代码: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类使用了装饰器模式,类关系以下:
image.pngspa

示例代码地址:装饰器模式Github地址设计

相关文章
相关标签/搜索