博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中介者模式
阅读量:4948 次
发布时间:2019-06-11

本文共 2702 字,大约阅读时间需要 9 分钟。

  中介者模式定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

  中介者模式针对的问题是,解决一系列对象之间复杂的耦合关系,这一系列对象往往是“多对多”的耦合关系,中介者模式采用一个中介者对象将这一系列对象集中管理,而各个对象也将自己与其它对象的交互行为委托给中介者处理,从而减少这一系列对象之间的耦合。

  中介者模式包含以下主要角色:

  抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。

  具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。

  抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。

  具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

  类图如下:

  下面我们就以房地产中介举个例子,首先是一个中介接口,有两个方法:注册用户和转发消息,然后有具体的中介者,它维护一个用户列表,再者就是抽象的用户类,持有一个中介者对象,同时提供两个抽象方法接收和发送供子类实现,最后就是具体的用户类。

package mediator;public interface Mediator {    void register(Customer cu);    void relay(Customer cu,String msg);}
package mediator;import java.util.ArrayList;import java.util.List;public class ConcreteMediator implements Mediator {    private List
list = new ArrayList
(); @Override public void register(Customer cu) { if(!list.contains(cu)) { list.add(cu); cu.setMedium(this); } } @Override public void relay(Customer cu,String msg) { for (Customer customer : list) { if(!customer.equals(cu)) { customer.receive(cu, msg); } } }}
package mediator;public abstract class Customer {    protected Mediator mediator;    protected String name;        public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Customer(String name) {        super();        this.name = name;    }    public void setMedium(Mediator mediator)    {        this.mediator=mediator;    }       public abstract void receive(Customer cu,String msg);       public abstract void send(Customer cu,String msg);}
package mediator;public class ConcreteCustomer extends Customer {    public ConcreteCustomer(String name) {        super(name);    }    @Override    public void receive(Customer cu, String msg) {        System.out.println(name + "收到消息:" + cu.getName() + "说" + msg);    }    @Override    public void send(Customer cu, String msg) {        System.out.println(name + "发布消息说:"+ msg);        mediator.relay(cu, msg);    }}

  运行测试代码

  从demo中可以看出通过中介者,买房和卖房实现了沟通,但双方乃至多方并不耦合,张三不需要为了告诉李四他要卖房而持有一个李四的对象。

  中介者模式是一种对象行为型模式,其主要优点如下:降低了对象之间的耦合性,使得对象易于独立地被复用;将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。其主要缺点是:当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。

  中介者模式适用于以下场景:

  当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。

  当想创建一个运行于多个类之间的对象,又不想生成新的子类时。

  在实际开发中,通常采用以下两种方法来简化中介者模式,使开发变得更简单:

  不定义中介者接口,把具体中介者对象实现成为单例。

  同时对象不持有中介者,而是在需要的时直接获取中介者对象并调用。

 

转载于:https://www.cnblogs.com/hhhshct/p/10373918.html

你可能感兴趣的文章
arm:启动代码判断是从nand启动还是从norflash启动,拷贝程序到内存的过程
查看>>
表格的拖拽功能
查看>>
QT5:QSS
查看>>
函数的形参和实参
查看>>
文字过长 用 ... 表示 CSS实现单行、多行文本溢出显示省略号
查看>>
1Caesar加密
查看>>
BZOJ 3779 重组病毒 LCT+线段树(维护DFS序)
查看>>
【TP SRM 703 div2 500】 GCDGraph
查看>>
MapReduce 重要组件——Recordreader组件 [转]
查看>>
2017-2018-2 20179225 《密码与安全新技术专题》 第6周作业
查看>>
转载:Linux命令行快捷键
查看>>
多个viewpager可能产生的问题
查看>>
webdriver api
查看>>
转载-FileZilla Server源码分析(1)
查看>>
apache 实现图标缓存客户端
查看>>
MediaWiki左侧导航栏通过特殊页面就可以设置。
查看>>
html基础之DOM操作
查看>>
几种图表库
查看>>
揭秘:黑客必备的Kali Linux是什么,有哪些弊端?
查看>>
linux系统的远程控制方法——学神IT教育
查看>>