时间:2021-05-19
中介者模式
面向对象设计鼓励将行为分布到各个对象中, 这种分布可能会导致对象间有许多连接. 在最坏的情况下, 每一个对象都需要知道其他所有对象.
虽然将一个系统分割成许多对象可增强可复用性, 但是对象间相互连接的激增又会降低其可复用性. 大量的连接关系使得一个对象不可能在没有其他对象的协助下工作(系统表现为一个不可分割的整体), 此时再对系统行为进行任何较大改动就十分困难. 因为行为被分布在许多对象中, 结果是不得不定义很多子类以定制系统的行为. 由此我们引入了中介者对象Mediator:
通过中介者对象, 可以将网状结构的系统改造成以中介者为中心的星型结构, 每个具体对象不再与另一个对象直接发生关系, 而是通过中介者对象从中调停.中介者对象的引入,也使得系统结构不会因新对象的引入造成大量的修改.
中介者模式:又称调停者模式, 用一个中介者对象(Mediator)来封装一系列对象的交互, 使各对象不需再显示地相互引用, 从而使耦合松散, 而且可以独立地改变他们之间的交互:
(图片来源: 设计模式: 可复用面向对象软件的基础)Tips: 各Colleague只知道Mediator的存在, 并不需要知道其他Colleague是否存在(不然怎么解耦呢), 它只需将消息发送给Mediator, 然后由Mediator转发给其他Colleague(由Mediator存储所有Colleague关系, 也只有Mediator知道有多少/哪些Colleague).
模式实现
联合国转发各国声明, 调停各国关系:
各国向联合国安理会发送和接收消息, 安理会在各国间'适当地'转发请求以实现协作行为:
Colleague
抽象同事类, 定义各同事的公有方法:
/** * @author jifang * @since 16/8/28 下午4:22. */public abstract class Country { protected UnitedNations mediator; private String name; public Country(UnitedNations mediator, String name) { this.mediator = mediator; this.name = name; } public String getName() { return name; } protected abstract void declare(String msg); protected abstract void receive(String msg);}--------------------------------------------------------------------------------
ConcreteColleague
具体同事类:
•每一个同事类都知道它的中介者对象.
•每一个同事对象在需与其他同事通信时, 与它的中介者通信.
--------------------------------------------------------------------------------
Mediator
抽象中介者: 定义一个接口用于与各同事对象通信:
public abstract class UnitedNations { protected List<Country> countries = new LinkedList<>(); public void register(Country country) { countries.add(country); } public void remove(Country country) { countries.remove(country); } protected abstract void declare(Country country, String msg);}--------------------------------------------------------------------------------
ConcreteMediator
具体中介者:
•了解并维护它的各个同事;
•通过协调各同事对象实现协作行为(从同事接收消息, 向具体同事发出命令).
如果不存在扩展情况, 那么Mediator可与ConcreteMediator合二为一.
•Client
--------------------------------------------------------------------------------
小结
Mediator的出现减少了各Colleague之间的耦合, 使得可以独立改变和复用各Colleague和Mediator, 由于把对象如何协作进行了抽象、将中介作为一个独立的概念并将其封装在一个对象中, 这样关注的焦点就从对象各自本身的行为转移到它们之间的交互上来, 从而可以站在一个更宏观的角度去看待系统.
•适用性
中介者模式很容易在系统中应用, 也很容易在系统中误用. 当系统出现了“多对多”交互复杂的对象群时, 不要急于使用中介者, 最好首先先反思系统的设计是否是合理. 由于ConcreteMediator控制了集中化, 于是就把交互复杂性变成了中介者的复杂性, 使得中介者变得比任一个ConcreteColleague都复杂. 在下列情况下建议使用中介者模式:
◦一组对象以定义良好但复杂的方式进行通信. 产生的相互依赖关系结构混乱且难以理解.
◦一个对象引用其他很多对象并且直接与这些对象通信, 导致难以复用该对象.
◦想定制一个分布在多个类中的行为, 而又不想生成太多的子类.
•相关模式
◦Facade与中介者的不同之处在于它是对一个对象子系统进行抽象, 从而提供了一个更为方便的接口, 它的协议是单向的, 即Facade对象对这个子系统类提出请求, 但反之则不可. 相反, Mediator提供了各Colleague对象不支持或不能支持的协作行为, 而且协议是多向的.
◦Colleague可使用Observer模式与Mediator通信.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java设计模式的中介者模式是行为模式之一。定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显式地相互引用,从而使其耦合性松散,并且可以独立地改
本文实例讲述了Python设计模式之中介模式。分享给大家供大家参考,具体如下:MediatorPattern:中介模式中介模式提供了一系列统一的系统接口。此模式
23种设计模式第二十篇:java中介者模式定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们
本文实例讲述了php设计模式之中介者模式。分享给大家供大家参考,具体如下:星际的升级系统做得比较平衡,不过由于不少兵种和建筑的制造都需要有相关的科技建筑,所以关
前言这是23+1(简单工厂模式)之中的最后一个了——访问者模式。访问者模式也是一个比较麻烦的设计模式。我也没有实战经验,对于访问者模式的理解完全来自GOF的《设