您的位置:首页 > 其它

第四个设计模式:装饰模式

2006-12-19 21:21 501 查看
第四个设计模式:装饰模式
装饰模式是对对象功能增强时,平时使用继承的一种替代方案
一.UML示意图



二.组成部分
1. 抽象构件:原始的功能接口
2. 具体构件:具体的原始功能类
3. 装饰角色:持有具体构件类的对象,以便执行原有功能
4. 具体装饰:具体扩展的功能在这里
三.例子代码:使用装饰模式来演示一个对”行走”功能扩展的例子(听音乐+行走和唱歌+行走)
1. 抽象构件
[align=left]package com.eekq.decorator;[/align]
[align=left] [/align]
[align=left]publicinterface Component {[/align]
[align=left] /**原始接口*/[/align]
[align=left] publicvoid go();[/align]
[align=left]}[/align]
2. 具体构件
[align=left]package com.eekq.decorator;[/align]
[align=left] [/align]
[align=left]publicclass ConcreteComponent implements Component {[/align]
[align=left] [/align]
[align=left] publicvoid go() { [/align]
[align=left] System.out.println("行走");[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
3.装饰角色来了
[align=left]package com.eekq.decorator;[/align]
[align=left] [/align]
[align=left]publicclass Decorator implements Component {[/align]
[align=left] /**持有私有的原始构件*/[/align]
[align=left] private Component component;[/align]
[align=left] [/align]
[align=left] /**构造子,委派给原始构件*/[/align]
[align=left] protected Decorator(Component component) {[/align]
[align=left] this.component = component;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**调用原始构件功能,通常就可直接把扩展功能加在此方法中*/[/align]
[align=left] publicvoid go() {[/align]
[align=left] this.component.go();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
4.具体装饰(这里演示了两种扩展的情况,走路+听音乐和唱歌s)
(1).
[align=left]package com.eekq.decorator;[/align]
[align=left] [/align]
[align=left]publicclass ConcreteDecoratorListen extends Decorator {[/align]
[align=left] [/align]
[align=left] /**构造子,相关初始化*/[/align]
[align=left] public ConcreteDecoratorListen(Component component) {[/align]
[align=left] super(component);[/align]
[align=left] // code is here[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**商业逻辑,对原始构件功能的扩展*/[/align]
[align=left] publicvoid go() { [/align]
[align=left] listen("听音乐");//执行扩展功能[/align]
[align=left] super.go();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] privatevoid listen(Object obj){[/align]
[align=left] System.out.println(obj); [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
(2).
[align=left]package com.eekq.decorator;[/align]
[align=left] [/align]
[align=left]publicclass ConcreteDecoratorSing extends Decorator {[/align]
[align=left] [/align]
[align=left] /**构造子,相关初始化*/[/align]
[align=left] public ConcreteDecoratorSing(Component component) {[/align]
[align=left] super(component);[/align]
[align=left] // code is here[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**商业逻辑,对原始构件功能的扩展*/[/align]
[align=left] publicvoid go() { [/align]
[align=left] super.go();[/align]
[align=left] System.out.println(sing());;// 执行扩展功能[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] private String sing() {[/align]
[align=left] return"唱歌";[/align]
[align=left] }[/align]
[align=left]}[/align]
5.客户端调用
[align=left]package com.eekq.decorator;[/align]
[align=left] [/align]
[align=left]publicclass Main {[/align]
[align=left] [/align]
[align=left] publicstaticvoid main(String[] args) {[/align]
[align=left] /**原始构件*/[/align]
[align=left] Component component = new ConcreteComponent();[/align]
[align=left] /**边听音乐,边走路*/[/align]
[align=left] ConcreteDecoratorListen cdl = new ConcreteDecoratorListen(component);[/align]
[align=left] cdl.go();[/align]
[align=left] System.out.println();[/align]
[align=left] /**边走路,边唱歌*/[/align]
[align=left] ConcreteDecoratorSing cds = new ConcreteDecoratorSing(component);[/align]
[align=left] cds.go();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
四.总结
优点:装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合,可以不用继承而达到这一效果.使用过多的继承会增加系统的复杂性和偶合性
缺点:装饰模式要产生一些辅助性的对象,但这些对象看上去都比较像,不是很容易检查(好的命名应该是提高检查的一个办法)
作者:飞行鱼 QQ:6868861 推荐J2EE群:7715552
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: