1.什么是装饰者设计模式
在不改变原类文件和使用继承的基础上,动态的给对象增添某些功能或行为。
2.为什么要使用装饰着设计模式
在面向对象的开发中,要实现给类或对象增加行为或功能,可以使用继承。但是,如果要给一个已经初始化的对象增添某些功能或行为,这是继承完成不了的;如果要继承许多类的功能或行为,使用继承生成子类进行扩充,这样可能有大量的扩展,为支持每一种组合将产生大量的子类,这将产生非常可怕的事情——类爆炸。但是,装饰者设计模式可以完美的解决上述的两个情况,装饰者设计模式在不改变原类文件和使用继承的基础上,动态的为对象添加某些功能或行为。
3.装饰者设计模式的适用范围
a.在不影响其他对象的同时,为某个对象动态、透明地增添一些职能。
b.处理那些可以撤销的职责。
c.当不能采用生成子类的方法进行扩充时。
<1>如果要继承许多类的功能或行为,使用继承生成子类进行扩充的话可能会有大量的扩展,为支持每一种组合将产生大量的子类,会产生类爆炸。
<2>类定义被隐藏或者不允许修改
4.装饰者设计模式的组成
a.抽象组件角色:定义一个对象接口,以规范准备接受附加职能的对象。
b.具体组件角色:被装饰者。
c.抽象装饰器:装饰者。
d.具体装饰器:向具体组件添加职能。
5.装饰者设计模式的UML图
6.装饰者设计模式的特点
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的索引(reference)
(3) 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
7.代码示例
(1)Drink.java
package codingke.decorator;
public interface Drink {
public String description();
public float cost();
}
<2>SoyaBeanMilk.java
package codingke.decorator;
public class SoyaBeanMilk implements Drink{
@Override
public String description() {
return "纯豆浆";
}
@Override
public float cost() {
return 3f;
}
}
<3>Decorator.java
package codingke.decorator;
public class Decorator implements Drink{
private Drink drink;
public Decorator(Drink drink) {
super();
this.drink = drink;
}
@Override
public String description() {
return drink.description();
}
@Override
public float cost() {
return drink.cost();
}
}
<4>SugarDecorator.java
package codingke.decorator;
public class SugarDecorator extends Decorator{
public SugarDecorator(Drink drink) {
super(drink);
}
@Override
public String description() {
return super.description()+"+糖";
}
@Override
public float cost() {
return super.cost()+0.5f;
}
}
<5>BlackBeanDecorator.java
package codingke.decorator;
public class BlackBeanDecorator extends Decorator{
public BlackBeanDecorator(Drink drink) {
super(drink);
}
@Override
public String description() {
return super.description()+"+黑豆";
}
@Override
public float cost() {
return super.cost()+1.0f;
}
}
<6>EggDecorator.java
package codingke.decorator;
public class EggDecorator extends Decorator{
public EggDecorator(Drink drink) {
super(drink);
}
@Override
public String description() {
return super.description()+"+鸡蛋";
}
@Override
public float cost() {
return super.cost()+2.0f;
}
}
<7>Guest.java
package codingke.decorator;
public class Guest {
public static void main(String[] args) {
Drink drink = new SoyaBeanMilk();
SugarDecorator sugar = new SugarDecorator(drink);
BlackBeanDecorator blackBean = new BlackBeanDecorator(sugar);
EggDecorator egg = new EggDecorator(blackBean);
System.out.println("客人的订单:"+egg.description());
System.out.println("客人消费的金额:"+egg.cost());
}
}