ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

观察者模式、中介者模式

2021-01-09 19:57:57  阅读:214  来源: 互联网

标签:角色 对象 同事 模式 观察者 抽象 中介


观察者模式(Observer)模式

定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

优缺点

优点:

  1. 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系;
  2. 目标与观察者之间建立了一套触发机制

缺点:

  1. 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用;
  2. 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

应用场景

  1. 对象间存在一对多关系,一个对象的状态发生改变会影响其它对象;
  2. 当一个抽象模式有两个方面,其中一个方面依赖于另一方面时,可将这二者封装在独立的对象中以使他们可以各自独立地改变和复用。

主要角色

  1. 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
  2. 具体主题类(ConcreteSubj)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
  3. 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
  4. 具体观察者(ConcreteObserver)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

结构图

在这里插入图片描述

实例

利用观察者模式设计一个程序,分析”人民币汇率“升降对进口公司及出口公司的影响
分析:当“人民币汇率”升值时,进口公司的出口产品成本降低且利润率提升,出口公司的出口产品收入降低且利润率降低;当“人民币汇率”贬值时,进口公司的进口产品成本提升且利润率降低,出口公司收入提升且利润率提升。
结构图如下:
在这里插入图片描述

中介者(Mediator)模式

定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。

优缺点

优点

  1. 降低了对象间的耦合性,使得对象易于独立地被复用;
  2. 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展;

缺点:当同时类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护

应用场景

  1. 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时可用;
  2. 当想创建一个运行于多个类之间的对象,又不想生成新的子类时可用。

主要角色

  1. 抽象中介者(Mediator)角色:它是具体中介者的接口,它提供了同事对象注册与转发同事对象信息的抽象方法。
  2. 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个List来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色;
  3. 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有互相影响的同事类的公共功能;
  4. 具体同事类(ConcreteColleague)角色:是抽象同事类的实现者,当需要与其它同事对象交互时,由中介者对象负责后续的交互。

结构图

在这里插入图片描述

实例

韶关房地产交流平台是”房地产中介公司“提供给”卖方客户“与”买方客户“进行信息交流的平台,比较适合用中介者模式来实现,结构图如下:
在这里插入图片描述

注意:该文章内容采摘于《软件设计模式(Java版)》,作者:程细柱

标签:角色,对象,同事,模式,观察者,抽象,中介
来源: https://blog.csdn.net/weixin_44048668/article/details/112400754

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有