【Java设计模式】行为型模式-中介者模式

2018-10-26  本文已影响0人  灰色孤星

源代码:https://gitee.com/AgentXiao/BehavioralPatterns
要点:
1、中介者模式的核心和本质
2、实现过程

一、引入案例

公司下面三个部门:财务部、市场部、研发部。财务部要发工资,需要让大家核对,需要跟市场部和研发部都通气;市场部要接个新项目,需要研发部处理技术、需要财务部出资金。市场部需要跟各个部门打交道。虽然只有三个部门,但是关系非常乱。

实际上,公司都有总经理。各个部门有什么事情都通报到总经理这里,总经理再通知各 个相关部门。

这就是一个典型的“中介者模式” ,总经理起到一个中介、协调的作用

二、中介者模式的核心

如果一个系统中对象之间呈现网状结构,对象之间存在大量的多对多关系,将导致系统非常复杂,这些对象称为“同事对象”。

引入一个中介者对象,使得每个同事对象只跟中介者对象打交道,将复杂的网状机构化解为星型结构。

网状结构化解为星型结构 中介者模式类图

三、中介者模式的实现

1、抽象中介者

/**
 * @interfaceName Mediator
 * @Description 抽象中介者
 * @Author xwd
 * @Date 2018/10/26 9:51
 */
public interface Mediator {
    /**
     * @MethodName getMsgFromDepartment
     * @Descrition 得到部门发送过来的信息
     * @Param [msg]
     * @return void
     */
    void getMsgFromDepartment(String msg);
    /**
     * @MethodName sendTaskToDepartment
     * @Descrition 向指定的部门发出任务
     * @Param [department, task]
     * @return void
     */
    void sendTaskToDepartment(String department,String task);
}

2、具体中介者(总经理)

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName Manager
 * @Description 具体中介者(总经理)
 * @Author xwd
 * @Date 2018/10/26 9:53
 */
public class Manager implements Mediator{

    private Map<String,Department> map = new HashMap<>();//存放部门信息

    public void setRelation(String depart,Department department){
        map.put(depart,department);
    }

    @Override
    public void sendTaskToDepartment(String department, String task) {
        map.get(department).getRequestFromManager(task);
    }

    @Override
    public void getMsgFromDepartment(String msg) {
        System.out.println(msg);
    }
}

总经理和各个部门的关系是一对多的关系,因此存放在一个Map集合中。

3、抽象同事类(部门类)

/**
 * @InterfaceName Department
 * @Description 抽象同事类(部门)
 * @Author xwd
 * @Date 2018/10/26 9:46
 */
public interface Department {
    /**
     * @MethodName sendRequestToManager
     * @Descrition 发送请求给总经理
     * @Param [req]
     * @return void
     */
    void sendRequestToManager(String req);
    /**
     * @MethodName getRequestFromManager
     * @Descrition 接收总经理的任务
     * @Param [task]
     * @return void
     */
    void getRequestFromManager(String task);
}

4、具体同事类(具体部门)

/**
 * @ClassName Development
 * @Description 具体同事类(研发部门)
 * @Author xwd
 * @Date 2018/10/26 9:55
 */
public class Development implements Department{

    private Manager manager;//持有总经理的引用

    public Development(Manager manager) {
        this.manager = manager;
        this.manager.setRelation("development",this);
    }

    @Override
    public void sendRequestToManager(String req) {
        this.manager.getMsgFromDepartment(req);
    }

    @Override
    public void getRequestFromManager(String task) {
        System.out.println(task);
    }
}

这里我们只列举了一个实际部门,实际上存在多个部门时使用中介者模式才能体现其效果。要点在于:每一个具体部门都持有总经理的引用,因此想要和其他部门打交道时,只需要将请求发送给总经理,统一由总经理进行分配。

5、测试

/**
 * @ClassName Client
 * @Description 测试
 * @Author xwd
 * @Date 2018/10/26 10:00
 */
public class Client {
    public static void main(String[] args) {
        Manager manager = new Manager();

        Department development = new Development(manager);
        development.sendRequestToManager("研发部:太穷了!没钱搞研发!");

        manager.sendTaskToDepartment("development","好的收到!");
    }
}

四、总结

1、本质

解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引 用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。

2、开发中的中介者模式

上一篇下一篇

猜你喜欢

热点阅读