美文网首页
装饰者模式

装饰者模式

作者: 谜00016 | 来源:发表于2019-02-24 01:18 被阅读10次

    提出需求

    卖早餐煎饼大叔需要我们提供煎饼价格计算服务。例如素煎饼5块,加一个鸡蛋1块,加一根香肠2块。不同的人会有不同的煎饼要求。

    需求分析

    这个问题我们可以简化为一个煎饼需要被装饰(功能增加),比如加鸡蛋或香肠。那么我们就很容易联想到能不能使用装饰者模式来进行此功能的完成呢?

    代码实现

    • 1.代码结构
    • 2 具体代码
      Cake

    /**
     * @Auther: ming.wang
     * @Date: 2019/2/23 13:45
     * @Description:
     */
    
    public abstract class Cake {
    
        public abstract String getName();
    
        public abstract long cost();
    
    }
    

    Battercake

    public class Battercake extends Cake {
        @Override
        public String getName() {
            return "煎饼";
        }
    
        @Override
        public long cost() {
            return 3;
        }
    }
    

    AbstractDecorator

    /**
     * @Auther: ming.wang
     * @Date: 2019/2/23 13:48
     * @Description: 抽象装饰类
     */
    public abstract class AbstractDecorator extends Cake {
    
        private Cake cake;
    
        public AbstractDecorator(Cake cake) {
            this.cake = cake;
        }
    
        @Override
        public String getName() {
            return cake.getName();
        }
    
        @Override
        public long cost() {
            return cake.cost();
        }
    }
    

    EggDecorator

    /**
     * @Auther: ming.wang
     * @Date: 2019/2/23 13:50
     * @Description: 具体的装饰类(鸡蛋)
     */
    public class EggDecorator extends AbstractDecorator {
        public EggDecorator(Cake cake) {
            super(cake);
        }
    
        @Override
        public String getName() {
            return super.getName()+" 再加一个鸡蛋";
        }
    
        @Override
        public long cost() {
            return super.cost()+1;
        }
    }
    
    

    SuasageDecorator

    /**
     * @Auther: ming.wang
     * @Date: 2019/2/23 13:52
     * @Description: 具体的装饰类(香肠)
     */
    
    public class SuasageDecorator extends AbstractDecorator {
    
        public SuasageDecorator(Cake cake) {
            super(cake);
        }
    
        @Override
        public String getName() {
            return super.getName()+" 再加一根香肠";
        }
    
        @Override
        public long cost() {
            return super.cost()+2;
        }
    }
    
    

    Test

    /**
     * @Auther: ming.wang
     * @Date: 2019/2/23 13:53
     * @Description:
     */
    public class Test {
        public static void main(String[] args) {
    
            Cake cake=new SuasageDecorator(new EggDecorator(new Battercake()));
    
            System.out.println(cake.getName()+ " 总计:"+cake.cost());
    
        }
    }
    

    总结

    装饰者模式基本套路:牢记四个角色

    • 被装饰者的超类,简称超类。本例中为Cake类,饼
    • 需要被装饰的具象类,父类为超类,本例中为Battercake煎饼
    • 抽象的装饰类,父类为超类,本例中为AbstractDecorator
    • 装饰类的具象类,父类为抽象的装饰类,本例中为EggDecorator和SuasageDecorator

      看下UML类图可能更清晰点

    相关文章

      网友评论

          本文标题:装饰者模式

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