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

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

来源:网络收集 时间:2026-10-01
导读: //具体的连续数据获取动作... } } 但是这一办法可能锁住Collection会很长时间,这段时间,其他客户端就不能访问该Collection了。 18 东方标准 http://soft.oneedu.cn 第二个解决方案是clone这个Collection,然后让连续

//具体的连续数据获取动作... } }

但是这一办法可能锁住Collection会很长时间,这段时间,其他客户端就不能访问该Collection了。

18

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

第二个解决方案是clone这个Collection,然后让连续的数据获取针对clone出来的那个Collection操作。这个方案前提是,这个Collection是可clone的,而且必须有提供深度clone的方法。Hashtable就提供了对自己的clone方法,但不是Key和value对象的clone,关于Clone含义可以参考专门文章。

public void foFetches(Hashtable ht){

Hashttable newht=(Hashtable)ht.clone(); }

问题又来了,由于是针对clone出来的对象操作,如果原来的母体被其他客户端操作修改了, 那么对clone出来的对象操作就没有意义了。

最后解决方案:我们可以等其他客户端修改完成后再进行clone,也就是说,这个特别的客户端先通过调用一个叫clone的方法来进行一系列数据获取操作。但实际上没有真正的进行对象拷贝,直至有其他客户端修改了这个对象Collection。

使用Proxy实现这个方案。这就是copy-on-write操作。

Proxy应用范围很广,现在流行的分布计算方式RMI和Corba等都是Proxy模式的应用。 更多Proxy应用,见http://www.research.umbc.edu/~tarr/cs491/lectures/Proxy.pdf

Sun公司的 Explore the Dynamic Proxy API Dynamic Proxy Classes

《===============戏说代理模式=================》

? 代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代

理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

? 跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多

少呀?”这些话,真烦人,写个程序做为我的Proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。

19

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

7.结构 / 适配器(Adapter)

适配器模式定义 : 将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份。

为何使用 ? 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口。怎么办? 使用Adapter,在这两种接口之间创建一个混合接口(混血儿)。

如何使用 ? 实现Adapter方式,其实\的\类再生\一节中已经提到,有两种方式:组合(composition)和继承(inheritance),如果你有些Java使用的经验,已经发现,这种模式经常使用。

假设我们要打桩,有两种类:方形桩 圆形桩。 public class SquarePeg{

public void insert(String str){

System.out.println(\ } }

public class RoundPeg{

public void insertIntohole(String msg){

System.out.println(\ } }

现在有一个应用,需要既打方形桩,又打圆形桩。那么我们需要将这两个没有关系的类综合应用。假设RoundPeg我们没有源代码,或源代码我们不想修改,那么我们使用Adapter来实现这个应用:

public class PegAdapter extends SquarePeg{ private RoundPeg roundPeg;

public PegAdapter(RoundPeg peg)(this.roundPeg=peg;) public void insert(String str){ roundPeg.insertIntoHole(str);} }

在上面代码中,RoundPeg属于Adaptee,是被适配者。PegAdapter是Adapter,将Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)进行适配。实际上这是将组合方法(composition)和继承(inheritance)方法综合运用。

PegAdapter首先继承SquarePeg,然后使用new的组合生成对象方式,生成RoundPeg的对象roundPeg,再重载父类insert()方法。从这里,你也了解使用new生成对象和使用extends继承生成对象的不同,前者无需对原来的类修改,甚至无需要知道其内部结构和源代码。

进一步使用:

上面的PegAdapter是继承了SquarePeg,如果我们需要两边继承,即继承SquarePeg 又继承RoundPeg,因为Java中不允许多继承,但是我们可以实现(implements)两个接口(interface) public interface IRoundPeg{

public void insertIntoHole(String msg); }

public interface ISquarePeg{

public void insert(String str); }

20

…… 此处隐藏:726字,全部文档内容请下载后查看。喜欢就下载吧 ……
经典的GOF设计模式笔记(7).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)