设计模式之Decorator(装饰者模式)

装饰者模式:装饰顾名思义就在原来的功能基础上加点装饰。
在java api中用到装饰者模式的最典型的就是IO流那部分了。
之前我的一篇文章中也用到装饰者模式:
[url]http://skyuck.iteye.com/blog/781065[/url]
[img]http://dl.iteye.com/upload/attachment/366437/b95fe9a6-f190-373e-b589-b04dfe670795.jpg[/img]


下面还是来用一个场景来描述吧:
很经典的一个场景就是咖啡的例子。例如我们喝咖啡一般有蓝山咖啡,拿铁咖啡等等。但是有时候我们去喝咖啡时需要加糖啊,咖啡也分为大杯,中杯,小杯。这样不同的咖啡价格就会不一样。
那么我们怎么去描述这些呢?

首先当然是我们的咖啡接口了

package com.unis.decorator;

public interface Coffee {

double getPrice();

String getInformation();

}

然后当然是对应到具体的咖啡

package com.unis.decorator;

public class LatteCoffee implements Coffee {

@Override
public String getInformation() {
return "拿铁咖啡";
}

@Override
public double getPrice() {
return 15;
}

}

package com.unis.decorator;

public class BlueMountainCoffee implements Coffee {

@Override
public String getInformation() {
return "蓝山咖啡";
}

@Override
public double getPrice() {
return 30;
}

}


为了让coffee可以被修饰,当然这里最重要的一个类就是我们的装饰者

package com.unis.decorator;

public class Decorator implements Coffee {

private Coffee coffee;

public Decorator(Coffee coffee) {
this.coffee = coffee;
}

@Override
public String getInformation() {
return coffee.getInformation();
}

@Override
public double getPrice() {
return coffee.getPrice();
}

}


有了装饰者我们就可以为咖啡来随意的添加一些附属的东西。

package com.unis.decorator;

public class SugarCoffee extends Decorator {

public SugarCoffee(Coffee coffee) {
super(coffee);
}

@Override
public String getInformation() {
return "加糖的"+super.getInformation();
}

@Override
public double getPrice() {
return super.getPrice()*1.5;
}



}

package com.unis.decorator;

public class LargeCoffee extends Decorator{

public LargeCoffee(Coffee coffee) {
super(coffee);
}

@Override
public String getInformation() {
return "大杯的"+super.getInformation();
}

@Override
public double getPrice() {
return super.getPrice()+2;
}



}




最后就是我们的测试类了:

package com.unis.decorator;

public class Test {

public static void main(String[] args) {
Coffee c = new LargeCoffee(new BlueMountainCoffee());
System.out.println(c.getInformation());
System.out.println(c.getPrice());
}
}



观察Decorator类。这个类要实现Coffee接口。并且在这个类中要包含Coffee这个接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值