Java面向对象程序设计(第2版)第18章.ppt

Java面向对象程序设计(第2版)第18章.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3、效果 优点:中间者模式将Colleague之间的强耦合变为弱耦合,这样就可独立地改变和复用各自的Colleague类和Mediator类。Colleague与Mediator之间是抽象耦合,Colleague不知道其所通信的Mediator究竟是哪个具体类,因而无论哪个继承层次的Colleague对象都可向Mediator对象发送消息,进而Colleague任意继承层次的类对象之间都可以进行相互通信;Mediator将原本分布于多个对象间的行为集中起来,改变这些行为只需要产生Mediator的子类即可。 缺点:中介者模式将交互的复杂性变为中介者的复杂性,这有可能使得中介者自身成为一个难以维护的庞然大物。 Memento模式 1、问题:称为原发器的对象常需要将内部的状态保存到外部的管理对象当中,形成具有历史记录的备忘录,必要时(例如执行Undo命令)可恢复原发器的状态,这个过程必须解决备忘录信息对管理者屏蔽而对原发器开放的问题。 Undo 3、效果 优点:使用备忘录可以避免暴露一些只应由原发器管理却又必须存储在原发器之外的信息。 缺点:如果原发器内部状态过多,拷贝到备忘录中的信息可能过大,导致代价过高;另外维护备忘录也有开销过大的潜在问题。 2、解决方案 Observer模式 问题:数据与表现形式是两个不同的概念,它们的关系可以用目标和观察者来说明。一个目标可以对应多个观察者,将目标和观察者分开有利于系统的设计,因为多个观察者可以共享一个目标。目标变化了,观察者也应变化,这样,目标如何保持与众多观察者数据状态的同步以及众多观察者之间的数据状态如何同步就是应该着重解决的问题。 图中,subject代表数据对象,它有三个observers对象,分别用表格、柱状图、饼图来展现subject中的数据。改变表格中的数据时,也就是改变了subject中的数据,之后柱状图和饼图对象收到通知,到subject中取回最新数据并进行界面刷新。如果站在observers的角度看,就实现了它们之间的数据状态同步。subject与observers这种交互关系也称为发布—订阅,目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。 2、解决方案 3、效果 优点:Subject和Observer各自可以独立变化,因而当观察者类型增加或要求变 更时,Subject可以不受影响,反之亦然;另外当目标状态变化时,目标就以广 播通信的方式通知各观察者,各观察者的数据状态因此可以保持同步,另外对 消息是否进行处理取决于各观察者自身。 缺点:一个观察者可能不知道另一个观察者的存在,它对目标的错误改变有可能 殃及其他的观察者,造成其他观察者错误的更新。 State模式 1、问题:对象的状态决定对象的行为,对象状态变化后,其行为也相应变化,通常采用条件语句来实现。例如当对象扩展出一个新状态后,增加一条case语句,case下放置行为代码,这样的设计违背了开闭原则。 2、解决方案 3、效果 优点:状态对象化后,如果Context出现新的状态,可对State扩展出具体子类,而Context中的代码不用修改,体现了开闭原则。 缺点:如果Context的状态过多,则会造成State具体类过多。 class Context { void request(State s){ s.handle(); } } class Context { void request(){ switch(a){ case 1: System.out.println(1); break; case 2: System.out.println(2); break; …… } } } a的取值可能因为需要不断变化,所以case语句也需要不断增加,从而Context类不断更改。 abstract class State { abstract void handle(); } class State1 extends State{ void handle(){System.out.prinln(1)}; } class State2 extends State{ void handle(){System.out.prinln(2)}; } :state2 :state1 :staten 当

文档评论(0)

junjun37473 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档