装饰者模式(Decorator)
为对象动态添加功能。
class diagram
装饰者(Decorator)和具体组件(ConcreteComponet)都继承自组件(Component), 具体组件的方法实现不需要依赖与其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。
所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。
实现:
设计不同种类的饮料,饮料可以添加配料,比如添加沙拉,牛奶。每增加一种配料,该饮料的价格就加1
组件
// 抽象接口饮料类
interface Drink{
double cost();
}
具体组件
// 具体组件饮料1
class Drink1 implements Drink{
@Override
public double cost() {
// TODO Auto-generated method stub
return 1;
}
}
//具体组件饮料2
class Drink2 implements Drink{
@Override
public double cost() {
// TODO Auto-generated method stub
return 1;
}
}
装饰者
// 抽象的装饰者
abstract class MatrialDecorator implements Drink{
protected Drink drink;
}
// 具体的装饰者1
class MilkMatrial extends MatrialDecorator{
public MilkMatrial(Drink drink) {
this.drink = drink;
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 1+drink.cost();
}
}
class CoffeeMatrial extends MatrialDecorator{
public CoffeeMatrial(Drink drink) {
this.drink = drink;
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 1+drink.cost();
}
}
测试
public class Test15 {
public static void main(String[] args) {
Drink drink = new Drink2();
drink = new MilkMatrial(drink);
drink = new CoffeeMatrial(drink);
System.out.println(drink.cost());
}
}