美文网首页
装饰模式

装饰模式

作者: 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