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

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

来源:网络收集 时间:2026-10-01
导读: 东方标准 http://soft.oneedu.cn } //以下可以是数据库更新 插入命令. public void saveToDb(){ ...... } 我们注意到,在product类中 的setXXX方法中,我们设置了 notify(通知)方法, 当Jsp表单调用setXXX(如何调用见

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

}

//以下可以是数据库更新 插入命令. public void saveToDb(){ ...... }

我们注意到,在product类中 的setXXX方法中,我们设置了 notify(通知)方法, 当Jsp表单调用setXXX(如何调用见我的另外一篇文章),实际上就触发了notisfyObservers方法,这将通知相应观察者应该采取行动了。

下面看看这些观察者的代码,他们究竟采取了什么行动:

//观察者NameObserver主要用来对产品名称(name)进行观察的 public class NameObserver implements Observer{ private String name=null;

public void update(Observable obj,Object arg){ if (arg instanceof String){ name=(String)arg;

//产品名称改变值在name中

System.out.println(\ } } }

//观察者PriceObserver主要用来对产品价格(price)进行观察的 public class PriceObserver implements Observer{ private float price=0;

public void update(Observable obj,Object arg){ if (arg instanceof Float){

price=((Float)arg).floatValue();

System.out.println(\ } } }

Jsp中我们可以来正式执行这段观察者程序:

if (request.getParameter(\{

product.saveToDb();

41

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

out.println(\产品数据变动 保存! 并已经自动通知客户\ }else{

//加入观察者

product.addObserver(nameobs); product.addObserver(priceobs); %>

//request.getRequestURI()是产生本jsp的程序名,就是自己调用自己 <% } %>

执行改Jsp程序,会出现一个表单录入界面, 需要输入产品名称 产品价格, 点按Submit后,还是执行该jsp的 if (request.getParameter(\之间的代码。

由于这里使用了数据javabeans的自动赋值概念,实际程序自动执行了setName setPrice语句。你会在服务器控制台中发现下面信息:

NameObserver :name changet to ?????(Jsp表单中输入的产品名称) PriceObserver :price changet to ???(Jsp表单中输入的产品价格); 这说明观察者已经在行动了.!!

同时你会在执行jsp的浏览器端得到信息 : 产品数据变动 保存! 并已经自动通知客户。上文由于使用jsp概念,隐含很多自动动作,现将调用观察者的Java代码写如下: public class Test {

public static void main(String args[]){

Product product=new Product();

NameObserver nameobs=new NameObserver(); PriceObserver priceobs=new PriceObserver(); //加入观察者

product.addObserver(nameobs); product.addObserver(priceobs); product.setName(\橘子红了\product.setPrice(9.22f); } }

《===============戏说观察模式=================》

? 观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题

对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

? 想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜

集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦

42

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

15.行为 / 责任链模式(Chain of Responsibility)

定义 :(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

如何使用 ? 虽然这一段是如何使用CoR,但是也是演示什么是CoR。有一个 Handler接口:

public interface Handler{

public void handleRequest(); }

这是一个处理request的事例, 如果有多种request,比如 请求帮助/请求打印或请求格式化: 最先想到的解决方案是:在接口中增加多个请求: public interface Handler{

public void handleHelp(); public void handlePrint(); public void handleFormat(); }

具体是一段实现接口Handler代码:

public class ConcreteHandler implements Handler{ private Handler successor;

public ConcreteHandler(Handler successor){ this.successor=successor; }

public void handleHelp(){

//具体处理请求Help的代码 ... }

public void handlePrint(){

//如果是print 转去处理Print successor.handlePrint(); }

public void handleFormat(){

//如果是Format 转去处理format successor.handleFormat(); } }

一共有三个这样的具体实现类,上面是处理help,还有处理Print 处理Format这大概是我们最常用的编程思路。

虽然思路简单明了,但是有一个扩展问题,如果我们需要再增加一个请求request种类,需要修改接口及其每一个实现。

第二方案:将每种request都变成一个接口,因此我们有以下代码 : public interface HelpHandler{

43

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

public void handleHelp(); }

public interface PrintHandler{ public void handlePrint(); }

public interface FormatHandler{ public void handleFormat(); }

public class ConcreteHandler

implements HelpHandler,PrintHandler,FormatHandlet{ private HelpHandler helpSuccessor; private PrintHandler printSuccessor; private FormatHandler formatSuccessor;

public ConcreteHandler(HelpHandler helpSuccessor,PrintHandler printSuccessor,

FormatHandler formatSuccessor){

this.helpSuccessor=helpSuccessor; this.printSuccessor=printSuccessor; this.formatSuccessor=formatSuccessor; }

public void handleHelp(){ ....... }

public void handlePrint(){this.printSuccessor=printSuccessor;}

public void handleFormat(){this.formatSuccessor=formatSuccessor;} }

这个办法在增加新的请求request情况下,只是节省了接口的修改量,接口实现ConcreteHandler还需要修改。而且代码显然不简单美丽。

解决方案3: 在Handler接口中只使用一个参数化方法: public interface Handler{

public void handleRequest(String request); }

那么Handler实现代码如下:

public class ConcreteHandler implements Handler{ private Handler successor;

public ConcreteHandler(Handler successor){ this.successor=successor; }

public void handleRequest(String requ …… 此处隐藏:4001字,全部文档内容请下载后查看。喜欢就下载吧 ……

经典的GOF设计模式笔记(14).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)