第2章 观察者和装饰模式.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第二章 观察者与装饰模式 目标 掌握观察者模式传送数据两种方式 使用Java内置包实现观察者模式 学习装饰模式的设计特点 利用模式和原则设计简单应用程序 Observer模式”push”和”pull”数据 具体主题可以通过两种方式通知具体观察者更新数据: ①push数据方式:具体主题将变化后的数据全部交给具体观察者; ②pull数据方式:具体主题提供获得数据的方法,具体观察者调用具体主题提供的方法获得数据。 观察者与多主题 一个具体观察者可以依赖于多个具体主题,在处理多主题时,主题采用拉数据方式;将观察者接口中数据更新方法的参数类型设置为主题接口类型。 代码-1 代码-2 代码-3 代码-4 运行 观察者模式特点 主题用一个共同的接口来更新观察者; 具体主题与具体观察者之间用松耦合方式结合,具体主题不知道具体观察者,只知道观察者接口; 该模式可以使用push或pull方式; Swing、RMI应用观察者模式 Java内置实现观察者模式 java.util包内包含最基本的Observer接口与Observable类(其子类作具体主题类) 利用Java内置实现-1 利用Java内置实现-2 运行 装饰模式 设计Starbucks菜单系统: 设计问题 上述设计会出现以下问题: ①调料价钱改变会使我们更改现有代码 ②一旦出现新的调料,就要加上新的方法,并改变超类中的cost()方法 ③出现新饮料,父类中的某些调料不适合,但仍将继承就不合适。 定义装饰模式 装饰模式结构与类图 结构: 举例 设计Starbucks咖啡菜单系统 代码 代码 运行 装饰模式特点 装饰模式特点 装饰java.io类 举例 编写一个装饰者,把输入流内的所有小写字符转成大写。 代码 运行 总结 掌握观察者模式传送数据两种方式 使用Java内置包实现观察者模式 学习装饰模式的设计特点 利用模式和原则设计简单应用程序 设计模式 设计模式 举例:修改气象站例子,增加一个具体主题(旅行社),让 布告板1既可以发布天气信息又可以发布旅游信息。布告板2 只能发布天气信息。 提供观察者拉数据方法 提供观察者拉数据方法 一个观察者可以有多个主题 拉数据 拉数据 拉数据 Observable -obs:Vector -changed:boolean + addObserver(Observer):void +deleteObserver():void #setChanged():void #clearChanged():void +hasChanged():Boolean +notifyObservers(Object):void +notifyObservers():void ConcreteObservable interface Observer +update(Observable,Object):void ConcreteObserver Subject:Observable +update(Observable,Object):void 导入内置包 先调用setChanged()方法,标记状态改变 Beverage(饮料) description milk soy mocha whip getDescription() cost()//计算所加调料价钱 hasMilk() setMilk() hasSoy() setSoy() hasMocha() setMocha() hasWhip() setWhip() //其它方法 HousBlend cost( ) Decaf cost( ) Espresso cost() DarkRoast cost() 调料 顾客1:摩卡和奶泡深焙 咖啡 顾客2:双倍摩卡咖啡 1.拿一个深焙咖啡DarkRoast对象 2.以Mocha对象装饰它 3.以Whip对象装饰第二步对象 4.调用cost()方法,并依赖委托将调料的 价钱加上去。 cost( ) DarkRoast Mocha cost() Whip cost( ) .99 .20 .10 1.29 通过调用最外圈装饰者Whip的cost()就可以得到 Whip的cost()会先委托它装饰的对象(Mocha) 计算出价钱,然后再加上Whip的价钱。 1.装饰者和被装饰对象有相同的超类型; 2.可以用一个或多个装饰者包装一个对象 3.装饰者可以在所委托被装饰者的行为 之前或之后,加上自己行为,以达到特定 目的. 装饰模式: 动态地将职责附加到对象上.若要扩展 功能,装饰者提供了比继承更有弹性的 替代方案 抽象组件(Component):是一个抽象类,定义被装饰者需要进行”装饰”方法 具体组件(ConcreteComponent):是抽象组

文档评论(0)

0520 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档