设计模式3 装饰者模式

装饰者模式:   

动态的将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择

OO原则:

封装变化

多用组合,少用继承

针对接口编程,不针对实现编程

为交互对象之间的松耦合设计而努力

对扩展开放,对修改关闭


问题来源:

在购买咖啡时,可以要求在其中加入各种调料,例如:蒸奶,豆浆,摩卡等其他调料,会根据加入的不同调料而收取不同的费用。

第一个尝试:


发现问题所在:

1,调料价钱的改变会使我们更改现有代码

2,一旦出现新的调料我们就要加入新的方法,并改变超类中的cost()方法

3,以后可能会开发出新饮料,对这些饮料而言,某些调料可能并不适合,但是在这种设计方案中,子类仍将继承那些不合适的方法

4,顾客如果要双倍的摩卡怎么办


装饰者模式山药出场啦!!!


先看设计图:


代码实现:

两个基类,一个咖啡,一个调料

1

public abstract class Beverage {
String description = "Unkown Beverage";

public String getDescription(){
return description;
}
public abstract double cost();
}

2

public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}

咖啡的具体实现:

1

public class Espresso extends Beverage{
public Espresso(){
description = "Espresso";
}
@Override
public double cost() {
return 1.99;
}
}

2

public class HouseBlend extends Beverage{
public HouseBlend(){
description = "HouseBlend";
}
public double cost() {
return .89;
}
}

调料的具体实现:

1

public class Mocha extends CondimentDecorator{
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return .20+beverage.cost();
}
}

2

public class Soy extends CondimentDecorator{
Beverage beverage;
public Soy(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+", Soy";
}
@Override
public double cost() {
return .10 + beverage.cost();
}
}

最后测试代码:

public class StarbuzzCoffee {
public static void main(String[] args) {

Beverage beverage = new Espresso();
// System.out.println(beverage.getDescription() + " $" + beverage.cost());
beverage = new Mocha(beverage);
beverage = new Soy(beverage);
beverage = new Mocha(beverage);
// beverage = new Mocha(beverage);
System.out.println(beverage.getDescription() + " $" + beverage.cost());
}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值