教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 高等教育 >

经典的GOF设计模式笔记(9)

来源:网络收集 时间:2026-10-01
导读: 东方标准 http://soft.oneedu.cn 9.结构 / 修饰模式(Decorator) Decorator定义 : 动态给一个对象添加一些额外的职责,就象在墙上刷油漆。使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。Decorato

东方标准 http://soft.oneedu.cn

9.结构 / 修饰模式(Decorator)

Decorator定义 : 动态给一个对象添加一些额外的职责,就象在墙上刷油漆。使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。Decorator还常被翻译成装饰,我觉得翻译成\油漆工\更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee。这两种实体在Decorator模式中是必须的。

为什么使用Decorator ? 我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。

使用Decorator的理由是 : 这些功能需要由用户动态决定加入的方式和时机。Decorator提供了\即插即用\的方法,在运行期间决定何时增加何种功能。

如何使用 ? 举Adapter中的打桩示例,在Adapter中有两种类:方形桩 圆形桩,Adapter模式展示如何综合使用这两个类,在Decorator模式中,我们是要在打桩时增加一些额外功能,比如,挖坑 在桩上钉木板等,不关心如何使用两个不相关的类。 我们先建立一个接口:

public interface Work{

public void insert(); }

接口Work有一个具体实现:插入方形桩或圆形桩,这两个区别对Decorator是无所谓。我们以插入方形桩为例:

public class SquarePeg implements Work{ public void insert(){

System.out.println(\方形桩插入\ } }

现在有一个应用:需要在桩打入前,挖坑,在打入后,在桩上钉木板,这些额外的功能是动态,可能随意增加调整修改,比如,可能又需要在打桩之后钉架子(只是比喻)。

那么我们使用Decorator模式,这里方形桩SquarePeg是decoratee(被刷油漆者),我们需要在decoratee上刷些\油漆\这些油漆就是那些额外的功能。 public class Decorator implements Work{ private Work work;

//额外增加的功能被打包在这个List中 private ArrayList others = new ArrayList();

//在构造器中使用组合new方式,引入Work对象; public Decorator(Work work) { this.work=work; others.add(\挖坑\ others.add(\钉木板\ }

public void insert(){ newMethod(); }

//在新方法中,我们在insert之前增加其他方法,这里次序先后是用户灵活指定的 public void newMethod()

26

东方标准 http://soft.oneedu.cn

{

otherMethod(); work.insert(); }

public void otherMethod() {

ListIterator listIterator = others.listIterator(); while (listIterator.hasNext()) {

System.out.println(((String)(listIterator.next())) + \正在进行\ } } }

在上例中,我们把挖坑和钉木板都排在了打桩insert前面,这里只是举例说明额外功能次序可以任意安排。 好了,Decorator模式出来了,我们看如何调用:

Work squarePeg = new SquarePeg();

Work decorator = new Decorator(squarePeg); decorator.insert(); Decorator模式至此完成。

如果你细心,会发现,上面调用类似我们读取文件(I/O)时的‘修饰器’调用:

FileReader fr = new FileReader(filename); BufferedReader br = new BufferedReader(fr);

实际上Java 的I/O API就是使用Decorator实现的,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐。 Jive中的Decorator实现

在论坛系统中,有些特别的字是不能出现在论坛中如\打倒XXX\我们需要过滤这些\反动\的字体。不让他们出现或者高亮度显示。

在IBM Java专栏中专门谈Jive的文章中,有谈及Jive中ForumMessageFilter。java使用了Decorator模式,其实,该程序并没有真正使用Decorator,而是提示说:针对特别论坛可以设计额外增加的过滤功能,那么就可以重组ForumMessageFilter作为Decorator模式了。

所以,我们在分辨是否真正是Decorator模式,以及会真正使用Decorator模式,一定要把握好Decorator模式的定义,以及其中参与的角色(Decoratee 和Decorator)。

《===============戏说修饰模式=================》

? 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提

供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 ? Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,

拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

27

东方标准 http://soft.oneedu.cn

10.结构 / 桥梁模式(Bridge)

Bridge模式定义 : 将抽象和行为划分开来,各自独立,但能动态的结合。

任何事物对象都有抽象和行为之分,例如人,人是一种抽象,人分男人和女人等;人有行为,行为也有各种具体表现,所以,“人”与“人的行为”两个概念也反映了抽象和行为之分。

在面向对象设计的基本概念中,对象这个概念实际是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,是一种抽象,一般情况下,行为是包含在一个对象中,但是,在有的情况下,我们需要将这些行为也进行归类,形成一个总的行为接口,这就是桥模式的用处。

为什么使用 ? 不希望抽象部分和行为有一种固定的绑定关系,而是应该可以动态联系的。

如果一个抽象类或接口有多个具体实现(子类、concrete subclass),这些子类之间关系可能有以下两种情况:

1. 这多个子类之间概念是并列的,如前面举例,打桩,有两个concrete class:方形桩和圆形

桩;这两个形状上的桩是并列的,没有概念上的重复。

2. 这多个子类之中有内容概念上重叠。那么需要我们把抽象共同部分和行为共同部分

各自独立开来,原来是准备放在一个接口里,现在需要设计两个接口:抽象接口和行为接口,分别放置抽象和行为。

例如,一杯咖啡为例,子类实现类为四个:中杯加奶、大杯加奶、 中杯不加奶、大杯不加奶。

但是,我们注意到:上面四个子类中有概念重叠,可从另外一个角度进行考虑,这四个类实际是两个角色的组合:抽象 和行为,其中抽象为:中杯和大杯;行为为:加奶 不加奶(如加橙汁 加苹果汁)。

实现四个子类在抽象和行为之间发生了固定的绑定关系,如果以后动态增加加葡萄汁的行为,就必须再增加两个类:中杯加葡萄汁和大杯加葡萄汁。显然混乱,扩展性极差。 那我们从分离抽象和行为的角度,使用Bridge模式来实现。

如何实现 ? 以上面提到的 咖啡 为例

我们原来打算只设计一个接口(抽象类),使用Bridge模式后,我们需要将抽象和行为分开,加奶和不加奶属于行为,我们将它们抽象成一个专门的行为接口。 先看看抽象部分的接口代码: public abstract class Coffee {

CoffeeImp coffeeImp; …… 此处隐藏:2195字,全部文档内容请下载后查看。喜欢就下载吧 ……

经典的GOF设计模式笔记(9).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/603940.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)