顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下:
Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:
[java] view plaincopy
- public interface Sourceable {
- public void method();
- }
[java] view plaincopy
- public class Source implements Sourceable {
- @Override
- public void method() {
- System.out.println("the original method!");
- }
- }
[java] view plaincopy
- public class Decorator implements Sourceable {
- private Sourceable source;
- public Decorator(Sourceable source){
- super();
- this.source = source;
- }
- @Override
- public void method() {
- System.out.println("before decorator!");
- source.method();
- System.out.println("after decorator!");
- }
- }
测试类:
[java] view plaincopy
- public class DecoratorTest {
- public static void main(String[] args) {
- Sourceable source = new Source();
- Sourceable obj = new Decorator(source);
- obj.method();
- }
- }
输出:
before decorator!
the original method!
after decorator!
装饰器模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多相似的对象,不易排错!
总结:我理解的装饰模式类似继承,但和继承不一致的地方在于继承是继承类型,而装饰模式是通过另一种形式继承了方法行为。
例继承:
public class a
{
protected aa="aa";
}
public class b extends a
{
//此时,B除了自己可以构建自己的成员外,还拥有了aa.
}
而装饰模式如下
public interface a接口{方法A,方法AA} 假设已有实现a接口的类aimpls
public class b {
定义类型aimpls
方法B,方法BB
}
那么如上的代码可以看到,在实例化b的时候可以b(new aimpls()),这样b不单单有了自己的方法B、方法BB 还拥有了a接口的方法及实现。