设计模式笔记----装饰模式

一,问题引入

辛巴克咖啡订单项目

1.咖啡种类:Espresso(意大利浓咖啡),ShortBlack,LongBlack(美式咖啡),Decaf(无因咖啡)

2.调料:milk,soy(豆浆),Chocolate

3.要球在扩展新的咖啡种类时,具有良好的扩展性,改动方便,易于维护

4.使用oo的思想来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以点单品咖啡+调料组合

二,解决方案一

三,解决方案二

四,使用装饰模式

1.装饰模式:动态的将新功能附加到对象上,在对功能扩展方面,他比继承更有弹性,装饰模式也体现了开闭原则

2.原理图

3.使用装饰模式设计类关系

4.代码实现

Drink类:

package 设计模式.装饰模式;

public abstract class Drink {
    public String des;
    private float price =0.0f;

    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    public String getDes() {
        return des;
    }
    public void setDes(String des) {
        this.des = des;
    }
    public abstract float cost();
}

Decorator

package 设计模式.装饰模式;

public class Decorator extends  Drink{
    private Drink obj;
    public Decorator(Drink obj){
        this.obj=obj;
    }
    @Override
    public float cost() {
        return super.getPrice()+obj.cost();
    }
    public String getDes(){
        return super.des+"&&"+obj.getDes();
    }
}

Coffee类:

package 设计模式.装饰模式;

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

Espresso:

package 设计模式.装饰模式;

public class Espresso extends Coffee{
    public Espresso(){
        setDes("Espresso");
        setPrice(1.0f);
    }
}

LongBlack

package 设计模式.装饰模式;

public class LongBlack extends  Coffee{
    public LongBlack(){
        setDes("Longblack");
        setPrice(2.0f);
    }
}

ShortBlack

package 设计模式.装饰模式;

import 设计模式.原型模式.improve.Sheep;

public class ShortBlack extends  Coffee{
        public ShortBlack(){
            setDes("ShortBlack");
            setPrice(3.0f);
        }
}

Milk

package 设计模式.装饰模式;

public class Milk extends  Decorator {
    public Milk(Drink obj) {
        super(obj);
        setDes("Milk");
        setPrice(1.2f);
    }
}

Soy

package 设计模式.装饰模式;

public class Soy extends Decorator {
    public Soy(Drink obj) {
        super(obj);
        setDes("Soy");
        setPrice(1.99f);
    }
}

Chocolate

package 设计模式.装饰模式;

public class Chocolate extends Decorator {
    public Chocolate(Drink obj) {
        super(obj);
        setDes("Chocolate");
        setPrice(3.0f);//调味品价格
    }
}

CoffeeStore://试用装饰模式下订单:2分巧克力+一份牛奶+一份LongBlack

package 设计模式.装饰模式;

public class CoffeeStore {
    public static void main(String []args){
        //试用装饰模式下订单:2分巧克力+一份牛奶+一份LongBlack
        Drink drink=new LongBlack();
        System.out.println(drink.getDes());
        System.out.println(drink.getPrice());
        drink=new Milk(drink);
        System.out.println(drink.getDes());
        System.out.println(drink.cost());
        drink=new Chocolate(drink);
        drink=new Chocolate(drink);
        System.out.println(drink.getDes());
        System.out.println(drink.cost());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值