动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
涉及角色:
抽象组件:定义一个抽象接口,来规范准备附加功能的类。
具体组件:将要被附加功能的类,实现抽象构件角色接口。
抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色接口。
具体装饰:实现抽象装饰者角色,负责为具体构件添加额外功能。
示例代码的实现(具体介绍):
Drink.java 被装饰者对象的接口
SoyaBeanMilk.java 具体的被装饰者对象
Decorator.java 装饰者基类
EggDecorator.java 具体装饰者对象
SugarDecorator.java 具体装饰者对象
BlackBeanDecorator.java 具体装饰者对象
//被装饰者的接口
public interface Drink {
//计算价格
float cost();
//描述
String description();
}
//具体的被装饰者对象,豆浆
public class SoyaBeanMilk implements Drink{
@Override
public float cost() {
return 10f;
}
@Override
public String description() {
return "纯豆浆";
}
}
//装饰者基类
public abstract class Decorator implements Drink {
private Drink drink;//要装饰的对象
public Decorator(Drink drink) {
this.drink = drink;
}
@Override
public float cost() {
return drink.cost();
}
@Override
public String description() {
return drink.description();
}
}
//具体装饰者对象
public class EggDecorator extends Decorator{
public EggDecorator(Drink drink) {
super(drink);
}
@Override
public float cost() {
return super.cost() +3.0f;
}
@Override
public String description() {
return super.description() + "+鸡蛋";
}
}
//具体装饰者对象
public class SugarDecorator extends Decorator{
public SugarDecorator(Drink drink) {
super(drink);
}
@Override
public float cost() {
return super.cost() +1.0f;
}
@Override
public String description() {
return super.description() + "+糖";
}
}
//具体装饰者对象
public class SugarDecorator extends Decorator{
public SugarDecorator(Drink drink) {
super(drink);
}
@Override
public float cost() {
return super.cost() +1.0f;
}
@Override
public String description() {
return super.description() + "+糖";
}
}
具体使用:
Drink drink = new SoyaBeanMilk();
SugarDecorator sugarDecorator = new SugarDecorator(drink);
EggDecorator eggDecorator = new EggDecorator(sugarDecorator);
BlackBeanDecorator blackBeanDecorator = new BlackBeanDecorator(eggDecorator);
System.out.println("你点的是:" + blackBeanDecorator.description());
System.out.println("价格是:" + blackBeanDecorator.cost() + "元");
最后得出的结果是:
你点的是:纯豆浆+糖+鸡蛋+黑豆
价格是:16.0元
本文介绍了装饰者模式的基本概念,通过示例代码展示了如何利用该模式为对象动态添加职责,相较于继承更加灵活。并通过豆浆添加配料的例子,具体说明了抽象组件、具体组件、抽象装饰者及具体装饰者的实现。
1471

被折叠的 条评论
为什么被折叠?



