java装饰模式

装饰模式:动态的给一个对象添加一些额外的职责。

适用性:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

处理那些可以撤销的职责。

优点:装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合,可以不用继承而达到这一效果.使用过多的继承会增加系统的复杂性 和偶合性

缺点:装饰模式要产生一些辅助性的对象,但这些对象看上去都比较像,不是很容易检查(好的命名应该是提高检查的一个办法)
package decorator; public interface Component { /**原始接口*/ public void go(); } public class ConcreteComponent implements Component { public void go() { System.out.println("行走"); } } public class Decorator implements Component { /**持有私有的原始构件*/ private Component component; /**构造子,委派给原始构件*/ protected Decorator(Component component) { this.component = component; } /**调用原始构件功能,通常就可直接把扩展功能加在此方法中*/ public void go() { this.component.go(); } } public class ConcreteDecoratorListen extends Decorator { /**构造子,相关初始化*/ public ConcreteDecoratorListen(Component component) { super(component); // code is here } /**商业逻辑,对原始构件功能的扩展*/ public void go() { listen("听音乐");//执行扩展功能 super.go(); } private void listen(Object obj){ System.out.println(obj); } } public class ConcreteDecoratorSing extends Decorator { /**构造子,相关初始化*/ public ConcreteDecoratorSing(Component component) { super(component); // code is here } /**商业逻辑,对原始构件功能的扩展*/ public void go() { super.go(); System.out.println(sing());;// 执行扩展功能 } private String sing() { return"唱歌"; } } public class TestDecorator { public static void main(String[] args) { /**原始构件*/ Component component = new ConcreteComponent(); /**边听音乐,边走路*/ ConcreteDecoratorListen cdl = new ConcreteDecoratorListen(component); cdl.go(); System.out.println("--------------------"); /**边走路,边唱歌*/ ConcreteDecoratorSing cds = new ConcreteDecoratorSing(component); cds.go(); System.out.println("--------------------"); ConcreteDecoratorSing cds2 = new ConcreteDecoratorSing(cdl); cds2.go(); } }

java装饰模式