第四个设计模式:装饰模式
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
装饰模式是对对象功能增强时,平时使用继承的一种替代方案
一.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
相关文章推荐
- 第四个设计模式:装饰模式
- 设计模式-装饰模式
- PHP设计模式:装饰模式
- Golang设计模式之装饰模式
- Java设计模式——装饰模式
- php 设计模式 之 装饰模式
- 设计模式:Decorator(装饰)模式
- 装饰设计模式
- 黑马程序员---IO2(缓冲区、装饰设计模式、转换流)
- 结构型设计模式(一)(适配器模式,桥接模式,组合模式,装饰模式)
- 设计模式3-装饰模式
- 设计模式之装饰模式
- PHP设计模式之装饰模式
- 通过C++和python场景实例理解装饰器设计模式。
- 设计模式-代理模式(和装饰模式的真正区别)
- 设计模式之:装饰模式
- 设计模式之装饰器模式的学习思考
- 设计模式---装饰模式(decorator)
- 设计模式学习之装饰模式
- 设计模式(单例、装饰、享元、模板)