package com.ceshi6; public interface Sourceable { public void method(); }
package com.ceshi6; public class Source implements Sourceable{ @Override public void method() { System.out.println("这是原方法!"); } }
package com.ceshi6; public class Decorator implements Sourceable{ private Sourceable source; public Decorator(Sourceable source){ super(); this.source = source; } @Override public void method() { System.out.println("装饰器之前!"); source.method(); System.out.println("装饰器之后!"); } }
package com.ceshi6; public interface DecoratorTest { public static void main(String[] args) { Sourceable source = new Source(); Sourceable obj = new Decorator(source); obj.method(); } }
结果:
有上可知,当多个类继承相同的接口,实现的方法是不一样的。其中方法可以被拓展成多个功能。
这种方式也是属于java三大特性(封装,继承,多态)之一的多态。
装饰器模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多相似的对象,不易排错!
在这里还要提到的一点就是,如果是使用抽象类或者类作为父类的话,子类是可以建一个新的方法,但是在使用
Sourceable source = new Source();的时候,
假设Sourceable 是抽象类,在source实例化之后事实上就是向上转型,但是子类中的新建的方法是不能调用的。
跟上面没有关系,只是想到了这一点。