设计模式——中介者模式

设计模式——中介者模式

1、中介者模式的定义

中介者模式:在实际应用中可能会遇到这样的问题,有多个对象且对象彼此相互影响,它们的关系是网状的,如果按照一般的处理方式来处理的话就会很麻烦且不易扩展。此时就需要使用一个相当于仲裁者的对象来处理对象之间的关系,即对象之和仲裁者发生关系而彼此之间不再发生关系,这样就将原本的网状关系解耦成松散的中心状关系,这样就会提高扩展性且对象之间的关系更加清晰,使用这种方式来解耦多个对象间关系的模式就叫中介者模式也就仲裁者模式!如下图所示:小圆表示同事对象,大圆表示中介者,连线表示对象间的关系

从图中直观的感受可以看出多个对象之间的关系变得清晰了,但是需要引入一个仲裁者对象,这个对象负责处理多个对象间的关系!

No BB,Show Code!

2、实现代码

2-1定义中介者接口

定义一个中介者接口,接口中定义中介者对象和同事对象的关系!代码如下:

package designPattern.test.mediator;

/**
 * 中介者接口
 */
public interface Mediator {

    //接收消息方法
    void receiveMsg(Colleague sender, String msg);

    //发送消息方法
    void sendMsg(Colleague receiver, String msg);
}

2-2定义抽象同事类

同事类就是图中小圆表示的对象!代码如下:

package designPattern.test.mediator;

/**
 * 抽象同事类
 */
public abstract class Colleague {

    private Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public Mediator getMediator() {
        return mediator;
    }

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void sendMsg(String msg);

    public abstract void execute(String msg);

}

2-3定义具体同事类

为了便于理解中介者模式,定义了HRDepartment,DevDepartment,MarketDepartment,FinanDepartment表示4个具体的同事类,分别表示公司的人力资源部、研发部、市场部和财务部,具体代码如下:

HRDepartment:

package designPattern.test.mediator;

/**
 * 人力资源部
 */
public class HRDepartment extends Colleague {

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

    @Override
    public void sendMsg(String msg) {
        System.out.println("HRDepartment send:" + msg);
    }

    @Override
    public void execute(String msg) {
        System.out.println("HRDepartment execute:" + msg);
    }

    public String toString() {
        return "HRDepartment";
    }

}

DevDepartment:

package designPattern.test.mediator;

/**
 * 研发部
 */
public class DevDepartment extends Colleague {

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

    @Override
    public void sendMsg(String msg) {
        System.out.println("DevDepartment send:" + msg);
    }

    @Override
    public void execute(String msg) {
        System.out.println("DevDepartment execute:" + msg);
    }

    public String toString() {
        return "DevDepartment";
    }
}

MarketDepartment:

package designPattern.test.mediator;

/**
 * 市场部
 */
public class MarketDepartment extends Colleague {

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

    @Override
    public void sendMsg(String msg) {
        System.out.println("MarketDepartment send:" + msg);
    }

    @Override
    public void execute(String msg) {
        System.out.println("MarketDepartment execute:" + msg);
    }

    public String toString() {
        return "MarketDepartment";
    }
}

FinanDepartment:

package designPattern.test.mediator;

/**
 * 财务部
 */
public class FinanDepartment extends Colleague {

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

    @Override
    public void sendMsg(String msg) {
        System.out.println("FinanDepartment send" + msg);
    }

    @Override
    public void execute(String msg) {
        System.out.println("FinanDepartment execute" + msg);
    }

    public String toString() {
        return "FinanDepartment";
    }
}

2-4定义具体中介者类

定义Boss类表示具体的中介者,代码如下:将多个具体的同事类放入具体的中介者类中统一管理

package designPattern.test.mediator;

/**
 * 大老板就是中介者
 */
public class Boss implements Mediator {

    private HRDepartment hrDepartment;

    private DevDepartment devDepartment;

    private MarketDepartment marketDepartment;

    private FinanDepartment finanDepartment;

    public HRDepartment getHrDepartment() {
        return hrDepartment;
    }

    public void setHrDepartment(HRDepartment hrDepartment) {
        this.hrDepartment = hrDepartment;
    }

    public DevDepartment getDevDepartment() {
        return devDepartment;
    }

    public void setDevDepartment(DevDepartment devDepartment) {
        this.devDepartment = devDepartment;
    }

    public MarketDepartment getMarketDepartment() {
        return marketDepartment;
    }

    public void setMarketDepartment(MarketDepartment marketDepartment) {
        this.marketDepartment = marketDepartment;
    }

    public FinanDepartment getFinanDepartment() {
        return finanDepartment;
    }

    public void setFinanDepartment(FinanDepartment finanDepartment) {
        this.finanDepartment = finanDepartment;
    }

    @Override
    public void receiveMsg(Colleague sender, String msg) {
        System.out.println("同事:" + sender.toString() + "发送消息:" + msg);
        sender.sendMsg(msg);
    }

    @Override
    public void sendMsg(Colleague receiver, String msg) {
        System.out.println("同事:" + receiver.toString() + "执行消息:" + msg);
        receiver.execute(msg);
    }
}

3-测试

测试代码如下:

package designPattern.test.mediator;

import org.junit.Test;

/**
 * 测试中介者模式
 */
public class MediatorTest {

    @Test
    public void testMediator() {
        Boss boss = new Boss();
        DevDepartment devDepartment = new DevDepartment(boss);
        boss.setDevDepartment(devDepartment);
        HRDepartment hrDepartment = new HRDepartment(boss);
        boss.setHrDepartment(hrDepartment);
        MarketDepartment marketDepartment = new MarketDepartment(boss);
        boss.setMarketDepartment(marketDepartment);
        FinanDepartment finanDepartment = new FinanDepartment(boss);
        boss.setFinanDepartment(finanDepartment);

        boss.receiveMsg(devDepartment,"研发部需要加人");
        boss.sendMsg(hrDepartment,"研发部需要加人");

        boss.receiveMsg(hrDepartment,"发布招聘公告,招研发");
        boss.sendMsg(finanDepartment,"准备工资");
    }
}

打印结果:

同事:DevDepartment发送消息:研发部需要加人
DevDepartment send:研发部需要加人
同事:HRDepartment执行消息:研发部需要加人
HRDepartment execute:研发部需要加人
同事:HRDepartment发送消息:发布招聘公告,招研发
HRDepartment send:发布招聘公告,招研发
同事:FinanDepartment执行消息:准备工资
FinanDepartment execute准备工资

此时,同事对象间的交互关系就被中介者和同事间的关系取代了!如果需要添加新的同事就不会影响到之前的逻辑了,易于维护!

总结:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互!

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值