装饰着模式

1、定义:再不改变原有对象的基础之上,将功能附加到对象上

      提供了比继承更有弹性的替代方案(扩展原有对象功能)

      类型:结构型

2、适用场景

  扩展一个类的功能或给一个类添加附加职责

  动态的给一个对象添加功能,这些功能可以再动态的撤销

3、优点

  继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能

  通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果

  符合开闭原则

4、缺点

  会出现更多的代码,更多的类,增加程序复杂性

  动态装饰时,多层装饰时会更加复杂

5、实现

/**
 * @description 抽象类
 * @author: hq
 * @create: 2022-08-28 15:42
 **/
public abstract class ABattercake {

    public abstract String getDesc();

    public abstract int cost();

}
/**
 * @description 煎饼
 * @author: hq
 * @create: 2022-08-28 15:44
 **/
public class Battercake extends ABattercake {
    @Override
    public String getDesc() {
        return "煎饼";
    }

    @Override
    public int cost() {
        return 8;
    }
}
/**
 * @description
 * @author: hq
 * @create: 2022-08-28 15:45
 **/
public class AbstractDecorator extends ABattercake {

    private ABattercake battercake;

    public AbstractDecorator(ABattercake battercake) {
        this.battercake = battercake;
    }

    @Override
    public String getDesc() {
        return battercake.getDesc();
    }

    @Override
    public int cost() {
        return battercake.cost();
    }
}
/**
 * @description
 * @author: hq
 * @create: 2022-08-28 20:39
 **/
public class EggDecorator extends AbstractDecorator {

    public EggDecorator(ABattercake battercake) {
        super(battercake);
    }

    @Override
    public String getDesc() {
        return super.getDesc() + " 加一个鸡蛋";
    }

    @Override
    public int cost() {
        return super.cost() + 1;
    }
}
/**
 * @description
 * @author: hq
 * @create: 2022-08-28 20:40
 **/
public class SausageDecorator extends AbstractDecorator {
    public SausageDecorator(ABattercake battercake) {
        super(battercake);
    }

    @Override
    public String getDesc() {
        return super.getDesc() + " 加一根香肠";
    }

    @Override
    public int cost() {
        return super.cost() + 2;
    }
}
/**
 * @description
 * @author: hq
 * @create: 2022-08-28 20:42
 **/
public class Test {

    public static void main(String[] args) {
        ABattercake battercake;

        battercake = new Battercake();

        battercake = new EggDecorator(battercake);

        battercake = new SausageDecorator(battercake);

        battercake = new SausageDecorator(battercake);

        System.out.println(battercake.getDesc());
        System.out.println(battercake.cost());

    }

}

 

posted @ 2022-08-28 18:09  放手解脱  阅读(33)  评论(0)    收藏  举报