首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

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

2012-08-17 
第四个设计模式:装饰模式第四个设计模式:装饰模式装饰模式是对对象功能增强时,平时使用继承的一种替代方案

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

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

装饰模式是对对象功能增强时,平时使用继承的一种替代方案一.UML示意图第四个设计形式:装饰模式二.组成部分:1.?????? 抽象构件:原始的功能接口2.?????? 具体构件:具体的原始功能类3.?????? 装饰角色:持有具体构件类的对象,以便执行原有功能4.?????? 具体装饰:具体扩展的功能在这里三.例子代码:使用装饰模式来演示一个对”行走”功能扩展的例子(听音乐+行走和唱歌+行走)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();??? }?}四.总结优点:装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合,可以不用继承而达到这一效果.使用过多的继承会增加系统的复杂性和偶合性缺点:装饰模式要产生一些辅助性的对象,但这些对象看上去都比较像,不是很容易检查(好的命名应该是提高检查的一个办法)

热点排行