设计模式|装饰者模式使用案例

装饰者模式概括

装饰者模式的特点是在不改变原有对象的基础上,将功能附加到对象上;提供了比继承更有弹性的替代方案(扩展原有对象)

  • 适用场景:扩展一个类的功能或给一个类加附加职责;动态的给一个对象添加功能,这些功能可以再动态的撤销。
  • 优点:继承的有力补充,比继承更灵活,不改变原有对象的情况下给一个对象扩展功能;通过使用不同的装饰类以及这些装饰类排列组合,可以实现不同的效果;符合开闭原则;
  • 缺点:会出现更多的代码、类,增加了程序的复杂性;动态装饰和多层装饰时会更复杂

装饰者模式使用案例

此代码是煎饼摊算账的场景,在初期设计代码时没有考虑到顾客会在一个煎饼里加多个鸡蛋或香肠的情况,导致功能不能支撑业务。痛定思痛后决定引入装饰者模式重构代码,代码如下:

煎饼抽象类

public abstract class ABattercake {
    protected abstract String getDesc();
    protected abstract int cost();
}

煎饼子类

public class Battercake extends ABattercake {
    @Override
    protected String getDesc() {
        return "煎饼";
    }

    @Override
    protected int cost() {
        return 8;
    }
}

煎饼父装饰类

public class AbstractDecorator extends ABattercake {
    private ABattercake aBattercake;
    public AbstractDecorator(ABattercake aBattercake){
        this.aBattercake = aBattercake;
    }
    @Override
    protected String getDesc() {
        return this.aBattercake.getDesc();
    }
    @Override
    protected int cost() {
        return this.aBattercake.cost();
    }
}

鸡蛋子装饰类

public class EggDecorator extends AbstractDecorator {
    public EggDecorator(ABattercake aBattercake){
        super(aBattercake);
    }
    @Override
    protected String getDesc(){
        return super.getDesc()+" 加一个鸡蛋";
    }
    @Override
    protected int cost(){
        return super.cost()+1;
    }
}

香肠子装饰类

public class SausageDecorator  extends AbstractDecorator {
    public SausageDecorator(ABattercake aBattercake) {
        super(aBattercake);
    }
    @Override
    protected String getDesc(){
        return super.getDesc()+"  加一个香肠";
    }
    @Override
    protected int cost(){
        return super.cost()+2;
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        ABattercake aBattercake = new Battercake();
        aBattercake = new SausageDecorator(aBattercake);
        aBattercake = new SausageDecorator(aBattercake);
        aBattercake = new SausageDecorator(aBattercake);
        aBattercake = new EggDecorator(aBattercake);
        aBattercake = new EggDecorator(aBattercake);
        System.out.println(aBattercake.getDesc()+"价格 :"+ aBattercake.cost());
    }
}

输出:煎饼  加一个香肠  加一个香肠  加一个香肠 加一个鸡蛋 加一个鸡蛋价格 :16

使用装饰者模式重构后代码可以满足各种灵活场景,对代码进行debug可以看到,煎饼类在最后具有了三个香肠对象和两个鸡蛋对象

设计模式|装饰者模式使用案例_第1张图片

类图如下:

设计模式|装饰者模式使用案例_第2张图片


 

 

 

 

你可能感兴趣的:(设计模式)