设计模式之中介者模式

一.中介者模式的简介

中介者模式(Mediator Pattern)用一个中介对象来封装一系列的对象的交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变他们之间的交互,该模式属于行为型模式。

中介者模式的核心思路: 多个对象之间若需交互,为防止这些对象互相引用(调用)的混乱,为降低这一系列对象之间的耦合度,可以使用一个中介者对象(Mediator)来管理(封装处理)多个对象(Colleague)之间的交互,这样新增和删除需要交互的对象时,不会影响到其他对象的正常使用,所有的交互任务只需要中介者类进行转发,中介者类需要关联所有需要交互的对象即可。

中介者模式应用案例: 在MVC模式中,C(控制器)就是M(数据模型)和V(视图)的中介者,负责数据层和视图层之间的交互。

二.中介者模式的设计类图

这里写图片描述
(图片加载慢,多刷新几下,耐心等待……)

注:同事类(Colleague)和中介者抽象类(Mediator),二者是聚合关系。

聚合关系:同事类(Colleague)包含中介者抽象类(Mediator),但中介者抽象类(Mediator)不是同事类(Colleague)的一部分。

三.中介者模式的代码及讲解

1.抽象中介者类(Mediator)

设计分析: 抽象中介者类提供一个处理对象之间交互的方法接口,并且关联需要通中介者交互的对象。

package com.pattern.Mediator.Mediator;

import com.pattern.Mediator.Colleague.Colleague;
/**
 * 抽象中介者类
 *
 */
public abstract class Mediator {
    //中介转发通信的 方法
    public void  send(String msg,Colleague colleague) {
    }
}
2.抽象同事类(Colleague)

设计分析: 实现抽象类的方法,并且知道所有同事类,从具体的同事对象接收消息,并且向具体的同事的对象发出命令。

package com.pattern.Mediator.Colleague;

import com.pattern.Mediator.Mediator.Mediator;
/**
 * 抽象同事类
 *
 */
public abstract class Colleague {

    //依赖中介
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
}
3.具体中介者类(ConcreteMediator)

设计分析: 实现抽象类的方法,并且知道所有通识类,从具体的同事对象接收消息,并且向具体的同事的对象发出命令。

package com.pattern.Mediator.Mediator;

import com.pattern.Mediator.Colleague.Colleague;
import com.pattern.Mediator.Colleague.ConcreteColleague1;
import com.pattern.Mediator.Colleague.ConcreteColleague2;

/**
 * 具体的中介者类
 *
 */
public class ConcreteMediator extends Mediator {
    private ConcreteColleague1 concreteColleague1;//同事1
    private ConcreteColleague2 concreteColleague2;//同事2

    public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
        this.concreteColleague1 = concreteColleague1;
    }

    public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
        this.concreteColleague2 = concreteColleague2;
    }

    @Override
    public void send(String msg, Colleague colleague) {
        //判断是谁先发起通信,然后中介将信息传达给另一个人
        if (colleague == concreteColleague1) {
            concreteColleague2.notify(msg);
        } else {
            concreteColleague1.notify(msg);
        }
        super.send(msg, colleague);
    }
}

4.具体同事类(ConcreteColleague)

设计分析: 每个具体的同事类只需要知道自己的行为,并且认识中介者类即可。

具体同事类1:

package com.pattern.Mediator.Colleague;

import com.pattern.Mediator.Mediator.Mediator;

/**
 * 具体同事类1
 *
 */
public class ConcreteColleague1 extends Colleague {

    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    //依赖中介,传达信息
    public void send(String msg) {
        mediator.send(msg, this);
    }

    //
    public void notify(String msg) {
        System.out.println("同事1接收到信息:"+msg);
    }
}

具体同事类2:

package com.pattern.Mediator.Colleague;

import com.pattern.Mediator.Mediator.Mediator;

/**
 * 具体同事类2
 *
 */
public class ConcreteColleague2 extends Colleague {

    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    public void send(String msg) {
        mediator.send(msg, this);
    }

    public void notify(String msg) {
        System.out.println("同事2接收到信息:" + msg);
    }
}
3.客户端(Client)中用法:

设计分析:展示发起请求、命令调用、命令接受、命令执行的实现 。

代码如下:

package com.pattern.Mediator.client;

import com.pattern.Mediator.Colleague.ConcreteColleague1;
import com.pattern.Mediator.Colleague.ConcreteColleague2;
import com.pattern.Mediator.Mediator.ConcreteMediator;

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        // 创建中介
        ConcreteMediator mediator = new ConcreteMediator();
        // 让个同事都认识中介
        ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(mediator);
        ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(mediator);
        // 让中介认识两个同事
        mediator.setConcreteColleague1(concreteColleague1);
        mediator.setConcreteColleague2(concreteColleague2);

        // 两个同事之间的通信,都通过中介转发
        concreteColleague1.send("1加2等于几?");
        concreteColleague2.send("等于3");
    }

}
6.运行结果

结果分析: 同事1通过中介者发送信息,同事2接收信息到信息后,再通过中介者将信息发送给同事1。

同事2接收到信息:1加2等于几?
同事1接收到信息:等于3
7.源码下载

本文示例代码下载地址:点击下载

三.总结:

中介者模式为了降低多个对象之间通信的复杂性,该模式提供了一个中介类,用于处理不同类之间的通信,从而降低多个类之间的耦合度,使代码易于维护。

1.中介者模式的优点
  • 降低了Colleague类之间的耦合度,可以修改Colleague类的同时不影响其他Colleague类。
2.中介者模式的缺点
  • 随着Colleague对象的增多,中介者会庞大,变得复杂难以维护
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值