java设计模式之——装饰模式结(构型模式)
三.例子代码:使用装饰模式来演示一个对”行走”功能扩展的例子(听音乐+行走和唱歌+行走)1. 抽象构件package com.eekq.decorator; publicinterface Component { /**原始接口*/ publicvoid go();}2. 具体构件package com.eekq.decorator; publicclass ConcreteComponent implements Component { publicvoid go() { System.out.println("行走"); } }3.装饰角色来了package com.eekq.decorator; publicclass Decorator implements Component { /**持有私有的原始构件*/ private Component component; /**构造子,委派给原始构件*/ protected Decorator(Component component) { this.component = component; } /**调用原始构件功能,通常就可直接把扩展功能加在此方法中*/ publicvoid go() { this.component.go(); } }4.具体装饰(这里演示了两种扩展的情况,走路+听音乐和唱歌s)(1).package com.eekq.decorator; publicclass ConcreteDecoratorListen extends Decorator { /**构造子,相关初始化*/ public ConcreteDecoratorListen(Component component) { super(component); // code is here } /**商业逻辑,对原始构件功能的扩展*/ publicvoid go() { listen("听音乐");//执行扩展功能 super.go(); } privatevoid listen(Object obj){ System.out.println(obj); } }(2).package com.eekq.decorator; publicclass ConcreteDecoratorSing extends Decorator { /**构造子,相关初始化*/ public ConcreteDecoratorSing(Component component) { super(component); // code is here } /**商业逻辑,对原始构件功能的扩展*/ publicvoid go() { super.go(); System.out.println(sing());;// 执行扩展功能 } private String sing() { return"唱歌"; }}5.客户端调用package com.eekq.decorator; publicclass Main { publicstaticvoid main(String[] args) { /**原始构件*/ Component component = new ConcreteComponent(); /**边听音乐,边走路*/ ConcreteDecoratorListen cdl = new ConcreteDecoratorListen(component); cdl.go(); System.out.println(); /**边走路,边唱歌*/ ConcreteDecoratorSing cds = new ConcreteDecoratorSing(component); cds.go(); } }四.总结优点:装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合,可以不用继承而达到这一效果.使用过多的继承会增加系统的复杂性和偶合性它通过传对象的形式(构造函数传参数)达到增强的目的,而不是继承缺点:装饰模式要产生一些辅助性的对象,但这些对象看上去都比较像,不是很容易检查(好的命名应该是提高检查的一个办法)
?
?
(7).装饰模式:
文章链接:http://www.iteye.com/topic/121149
优点:装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合,可以不用继承而达到这一效果.使用过多的继承会增加系统的复杂性和偶合性
它通过传对象的形式(构造函数传参数)达到增强的目的,而不是继承
缺点:装饰模式要产生一些辅助性的对象,但这些对象看上去都比较像,不是很容易检查(好的命名应该是提高检查的一个办法)
?第四个设计模式:装饰模式
装饰模式是对对象功能增强时,平时使用继承的一种替代方案
一.UML示意图:
二.组成部分:
1.?????? 抽象构件:原始的功能接口
2.?????? 具体构件:具体的原始功能类
3.?????? 装饰角色:持有具体构件类的对象,以便执行原有功能
4.?????? 具体装饰:具体扩展的功能在这里
?