美文网首页
装饰模式

装饰模式

作者: setone | 来源:发表于2018-08-13 15:59 被阅读0次

设计原则:

1.类应该对扩展开放,对修改关闭

装饰模式

不修改任何底层代码的情况下,给对象赋予新的职责

应用场景:街边一个卖手抓饼的商贩,手抓饼(HandCake.java)的价格是1块,如果你需要加上别的小菜----鸡蛋,肉等等(Leeks.java,Pork.java,FiredEgg.java),那么你就需要加钱
如图是我们本次需要用到的类(这里只有继承)


image.png

1.Beverage.java(总的抽象类)

public abstract class Beverage {
    private String desc = "Unknown Cake";;

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    // 价格抽象
    public abstract BigDecimal price();
}

2.Condiment.java(配料抽象类)

public abstract class Condiment extends Beverage{
    public abstract String getDesc();
}

3.HandCake.java(手抓饼实现类)

public class HandCake extends Beverage {
    public HandCake() {
        this.setDesc("手抓饼");
    }

    @Override
    public BigDecimal price() {
        return BigDecimal.ONE;
    }
}

4.FiredEgg.java(配料实现类)

public class FiredEgg extends Condiment {

    private Beverage beverage;

    public FiredEgg(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDesc() {
        return beverage.getDesc() + ",鸡蛋";
    }
    
    public BigDecimal price() {
        return beverage.price().add(BigDecimal.ONE);
    }
}

5.Test.java(测试类)

public class Test {
    public static void main(String[] arg){
        Beverage beverage = new HandCake();
        Console.log("类型:"+beverage.getDesc()+"===========价格:"+beverage.price());

        beverage = new FiredEgg(beverage);
        beverage = new FiredEgg(beverage);
        beverage = new Pork(beverage);
        beverage = new Leeks(beverage);
        
        Console.log("类型:"+beverage.getDesc()+"===========价格:"+beverage.price());
    }

}

运行结果


image.png

总结:装饰模式可以非常灵动的添加装饰者和委托者

heard First:

1.装饰者和被装饰者有着相同的超类;
2.你可以用一个或者多个装饰者包装一个对象;
3.既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰对象替换它。
4.装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定目的。
5.对象可以在任何时候被装饰,所以可以在运行时动态地,不限量地用你喜欢的装饰着来装饰对象

相关文章

网友评论

      本文标题:装饰模式

      本文链接:https://www.haomeiwen.com/subject/fbkubftx.html