装饰模式(Decorator)
装饰模式又名包装模式,是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。举个例子,比如有一个车(Vehicle)对象, 现在提倡环保,车可以烧各种燃料,如电、天然气、柴油、汽油、氢气等,也可以烧几种燃料的组合,如果氢气和柴油,汽油和电等。如果这样使用继承,就会有很多的子类。这时可以使用装饰模式。
主要角色:
- 接口或者抽象基类:所有类的统一接口或父类
- 被装饰对象:被装饰者。
- 装饰角色:所有装饰类的父类。
- 具体装饰
采用继承类图:
采用装饰模式类图:
示例代码:
接口:
package com.dp.decorator;
public interface Vehicle {
public void run();
}
被装饰对象:
package com.dp.decorator;
public class ConcreteVehicle implements Vehicle{
@Override
public void run() {
System.out.print("我的动力系统是:");
}
}
装饰角色:
package com.dp.decorator;
public class Decorator implements Vehicle{
private Vehicle v;
public Decorator(Vehicle v) {
this.v= v;
}
@Override
public void run() {
v.run();
}
}
具体装角色(汽油):
package com.dp.decorator;
public class GasolineDecorator extends Decorator {
public GasolineDecorator (Vehicle v) {
super(v);
}
public void power(){
System.out.print("汽油");
}
public void run(){
super.run();
power();
}
}
具体装角色(柴油):
package com.dp.decorator;
public class DieselDecorator extends Decorator {
public DieselDecorator (Vehicle v) {
super(v);
}
public void power(){
System.out.print("柴油");
}
public void run(){
super.run();
power();
}
}
具体装角色(太阳能):
package com.dp.decorator;
public class SolarDecorator extends Decorator {
public SolarDecorator (Vehicle v) {
super(v);
}
public void power(){
System.out.print("太阳能");
}
public void run(){
super.run();
power();
}
}
客户端的调用:
package com.dp.decorator;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Vehicle v = new ConcreteVehicle();
Decorator d = new GasolineDecorator(v);
d.run();//汽油
Decorator d1 = new DieselDecorator (d);
d1.run();//汽油和柴油
Decorator d2 = new SolarDecorator(d1);
d2.run();//汽油、柴油和太阳能,超强哈哈哈..
}
}
装饰器模式的适用场合:
- 需要给一个类扩展功能,或给一个类增加附加责任
- 需要动态的给一个类增加功能,还可以动态的撤消
- 需要增加有一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
装饰器模式在java io种得到了充分的运用,例如java.io.FilterInputStream采用的就是一个装饰器模式,这个类本身是一个装饰器的抽象类(父类), 他有许多的子类,是具体的装饰器。类图:
事情就是这么个事情,情况就是这么个情况,不对之处,多多指教.......