随笔 - 79,  文章 - 0,  评论 - 1,  阅读 - 45457

 

1. 顶咖啡问题

  咖啡种类:Espresso,LongBlack

  调料:Milk,Soy

  当需要计算不同种类咖啡和调料组合的价格时

  (1)使用传统方式

   这样设计,会有很多类,当需要增加一个单品咖啡或调料时,类的数量就会倍增

 

  (2)优化方式1

   优点:可以把调料放入Drink类中,通过设计调料的boolean类型,表示添加相应的调料,减少类的数量

  缺点:增加或删除调料种类时,代码的维护量同样比较大

  

  (3)装饰者模式

  动态的将新功能附加到对象上

 

复制代码
public abstract class Drink {

    public String desc;

    private float price;

    public String getDesc() {
        return desc;
    }

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

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public abstract float cost();
}
复制代码
public class Coffee extends Drink {

    @Override
    public float cost() {
        return super.getPrice();
    }
}
public class LongBlack extends Coffee{

    public LongBlack(){
        setDesc(" longblack ");
        setPrice(5.0f);
    }
}
public class Espresso extends Coffee {

    public Espresso(){
        setDesc(" 意大利咖啡 ");
        setPrice(1.0f);
    }
}
复制代码
public class Decorator extends Drink {

    private Drink drink;

    public Decorator(Drink drink){
        this.drink = drink;
    }

    @Override
    public float cost() {
        return drink.cost() + super.getPrice();
    }

    @Override
    public String getDesc() {
        return desc + " " + getPrice()+ "&&" +  super.getDesc();
    }
}
复制代码
public class Milk extends Decorator {

    public Milk(Drink drink){
        super(drink);
        setDesc( " 牛奶 ");
        setPrice(2.0f);
    }
}
public class Soy extends Decorator {

    public Soy(Drink drink) {
        super(drink);
        setDesc(" 豆浆 ");
        setPrice(3.0f);
    }
}
复制代码
public class Client {
    public static void main(String[] args) {
        //装饰者模式下 :

        //1. 点一份 longblack
        Drink order = new LongBlack();
        System.out.println("费用1=" + order.cost());
        System.out.println("描述=" + order.getDesc());

        //2. order 加入牛奶
        order = new Milk(order);
        System.out.println(" order 加入牛奶 费用2= " + order.cost());
        System.out.println(" order 加入牛奶 描述=" + order.getDesc());

        //3. order 加入豆浆
        order = new Soy(order);
        System.out.println(" order 加入豆浆,加入牛奶 费用3= " + order.cost());
        System.out.println(" order 加入豆浆,加入牛奶 描述=" + order.getDesc());
    }
}
复制代码

 

posted on   homle  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示