美文网首页
【Java设计模式】行为型模式-中介者模式

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

作者: 灰色孤星 | 来源:发表于2018-10-26 10:47 被阅读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、开发中的中介者模式

    • MVC模式(其中的C,控制器就是一个中介者对象。M和V都和他打交 道) 。
    • 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象。
    • Java.lang.reflect.Method#invoke()

    相关文章

      网友评论

          本文标题:【Java设计模式】行为型模式-中介者模式

          本文链接:https://www.haomeiwen.com/subject/nclktqtx.html