码迷,mamicode.com
首页 > 其他好文 > 详细

手抓饼跟装饰模式

时间:2016-07-17 23:33:56      阅读:613      评论:0      收藏:0      [点我收藏+]

标签:

公司门口有一个小摊买手抓饼和肉夹馍的,有时候中午不想吃饭就会去光顾一下那个小摊,点了手抓饼之后往往还可以在这个基础之上增加一些配料,例如煎蛋,火腿片等等,每个配料的价格都不一样,不管你怎么配配料,最终价格是手抓饼基础价加上每一种所选配料价格的总和。小摊的价格单如下:

技术分享

如何使用一种设计模式来处理价格计算的问题呢,或许我们可以试试装饰者模式,因为在这里,主体是手抓饼活着肉夹馍,而配料则是装饰者,我先用UML类图来描述一下类之间的协作关系。

技术分享

再来看看具体java代码是怎么实现的:

 1 public abstract class Pancake {
 2     
 3     public String desc = "我不是一个具体的煎饼";
 4 
 5     public String getDesc() {
 6         return desc;
 7     }
 8     
 9     public abstract double price();
10 
11 }
public class TornCake extends Pancake {

    public TornCake() {
        desc = "手抓饼";
    }

    @Override
    public double price() {
        return 4;
    }

}
public class Roujiamo extends Pancake {

    public Roujiamo() {
        desc = "肉夹馍";
    }

    @Override
    public double price() {
        return 6;
    }

}
public abstract class Condiment extends Pancake {

    public abstract String getDesc();

}
public class FiredEgg extends Condiment {
    private Pancake pancake;
    
    public FiredEgg(Pancake pancake) {
        this.pancake = pancake;
    }

    @Override
    public String getDesc() {
        return pancake.getDesc() + ", 煎蛋";
    }

    @Override
    public double price() {
        return pancake.price() + 2;
    }

}
public class Ham extends Condiment {
    private Pancake pancake;
    
    public Ham(Pancake pancake) {
        this.pancake = pancake;
    }

    @Override
    public String getDesc() {
        return pancake.getDesc() + ", 火腿片";
    }

    @Override
    public double price() {
        return pancake.price() + 1.5;
    }

}

MeatFloss类和Cucumber类跟FiredEgg很相似,我就不一一列出来了,最后看看测试类:

public class MyTest {
    
    @Test
    public void test() {
        Pancake tornCake = new TornCake();
        //手抓饼基础价
        System.out.println(String.format("%s ¥%s", tornCake.getDesc(), tornCake.price()));
        
        Pancake roujiamo = new Roujiamo();
        roujiamo = new FiredEgg(roujiamo);
        roujiamo = new FiredEgg(roujiamo);
        roujiamo = new Ham(roujiamo);
        roujiamo = new MeatFloss(roujiamo);
        roujiamo = new Cucumber(roujiamo);
        //我好饿
        System.out.println(String.format("%s ¥%s", roujiamo.getDesc(), roujiamo.price()));
    }

}

技术分享

我是刚学设计模式的小白,欢迎各位拍砖:)

手抓饼跟装饰模式

标签:

原文地址:http://www.cnblogs.com/stonefeng/p/5679638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!