装饰者模式

装饰者模式_第1张图片
装饰者模式:指在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的方案,最本质的特征是将原有类的附加功能抽离出来,简化原有类的逻辑

经典栗子:
小王出去买早餐,走到山东杂粮煎饼老板门前:老板给我一个煎饼(不要煎,不要饼),给我加个鸡蛋,老板扒拉扒拉,快做好了,小王肚子咕噜咕噜叫,立马说,老板再加个鸡蛋。只见老板一句草,敲碎了鸡蛋放入快做好的煎饼中。折磨人的小王此时又面露邪恶的笑容,说道:老板再来一根火腿,老板只好紧紧捏住拳头,也不敢出手,只好照做…小王边走边吃着煎饼,走到一个巷子里,突然一麻布袋过来,被暴打了一顿…
上代码吧

  • 规范类
public abstract class Cake {
    protected abstract String getMsg();
    protected abstract int getPrice();
}
  • 基础类
public class BaseCake extends Cake {
    @Override
    protected String getMsg() {
        return "煎饼";
    }
    @Override
    protected int getPrice() {
        return 5;
    }
}
  • 扩展类A
public class EggCakeDecorator extends Cake {
    private Cake cake;

    public EggCakeDecorator(Cake cake) {
        this.cake = cake;
    }
    @Override
    protected String getMsg() {
        return this.cake.getMsg()+"加一个鸡蛋";
    }
    @Override
    protected int getPrice() {
        return this.cake.getPrice()+1;
    }
}
  • 扩展类B
public class SausageCakeDecorator extends Cake {
    private Cake cake;

    public SausageCakeDecorator(Cake cake) {
        this.cake = cake;
    }
    @Override
    protected String getMsg() {
        return this.cake.getMsg()+"加一根火腿";
    }
    @Override
    protected int getPrice() {
        return this.cake.getPrice()+2;
    }
}
  • 测试
public class Test {
    public static void main(String[] args) {
        Cake cake = new BaseCake();
        //加一个鸡蛋
        cake = new EggCakeDecorator(cake);
        //再加个鸡蛋
        cake = new EggCakeDecorator(cake);
        //在加根火腿
        cake = new SausageCakeDecorator(cake);
        System.out.println("合计:"+cake.getMsg()+"价格:"+cake.getPrice());
    }
}
  • 结果
    在这里插入图片描述
    装饰者模式
    优点:
    • 装饰者模式是继承的有力补充,且比继承灵活,可以在不改变原有对象的情况下动态地给一个对象 扩展功能,即插即用。
    • 使用不同的装饰类及这些装饰类的排列组合,可以实现不同的效果。
    • 装饰者模式完全符合开闭原则。
      缺点:
    • 会出现更多的代码、更多的类,增加程序的复杂性

你可能感兴趣的:(装饰者模式)