装饰者模式

package C_Decker;

/**
* 设计原则:类应该对扩展开放,对修改关闭。
* 装饰者模式:动态地将责任和行为附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
*
* 装饰者模式特点:
* 1:装饰者和被装饰对象有相同的超类型。
* 2:可以用一个或多个装饰者包装一个对象。
* 3:既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,
* 4:可以用装饰过的对象代替它。
* 5:装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
* 6:对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。
* 7:装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。
*
* 在这里使用继承达到”类型匹配”而不是继承”行为”
*/
public class Main {
public static void main(String[] args) {
// 订一杯espresso不需要调料
Espresso espresso = new Espresso();
System.out.println(espresso.getDeScription() + ” ” + espresso.cost());

    Beverage beverage1 = new HouseBlend();
    beverage1 = new Mocha(beverage1);
    beverage1 = new Mocha(beverage1);
    beverage1 = new Whip(beverage1);
    System.out.println(beverage1.getDeScription() + " " + beverage1.cost());
}

}
package C_Decker;

/* 饮料类 /
public abstract class Beverage {
public static final int TALL = 10;
public static final int GRANDE = 20;
public static final int VENTI = 25;
String deScription = “未知饮料”;
int size;

public void setSize(int size) {
    this.size = size;
}

public int getSize() {
    return size == 0 ? TALL : size;
}

public String getDeScription() {
    return deScription;
}

abstract double cost();

}

/* 调料装饰类 /
abstract class CondimentDecorator extends Beverage {
public abstract String getDeScription();
}

/* 饮料代码 /
class Espresso extends Beverage {

public Espresso() {
    deScription = "Espersso";
}

double cost() {
    return 1.99;
}

}

class HouseBlend extends Beverage {
public HouseBlend() {
deScription = “HouseBlend”;
}

double cost() {
    return 1.99;
}

}

/* 调料代码 /
class Mocha extends CondimentDecorator {
Beverage beverage;

public Mocha(Beverage beverage) {
    this.beverage = beverage;
}

public String getDeScription() {
    // 利用委托,得到饮料叙述,然后在后面附加叙述Mocha
    return beverage.getDeScription() + ",Mocha";
}

double cost() {
    return 20 + beverage.cost();
}

}

class Whip extends CondimentDecorator {
Beverage beverage;

public Whip(Beverage beverage) {
    this.beverage = beverage;
}

public String getDeScription() {
    // 利用委托,得到饮料叙述,然后在后面附加叙述Mocha
    return beverage.getDeScription() + ",Whip";
}

double cost() {
    return 20 + beverage.cost();
}

}

// 根据大小收取相应的费用
class Soy extends CondimentDecorator {
Beverage beverage;

public Soy(Beverage beverage) {
    this.beverage = beverage;
}

public int getSize() {
    return beverage.getSize();
}

public String getDeScription() {
    return beverage.getDeScription() + ",Soy";
}

double cost() {
    double cost = beverage.cost();
    if (getSize() == Beverage.TALL) {
        cost += .10;
    } else if (getSize() == Beverage.GRANDE) {
        cost += .15;
    } else if (getSize() == Beverage.VENTI) {
        cost += .20;
    }
    return cost;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值