美文网首页
中介者模式(Mediator)

中介者模式(Mediator)

作者: jiahzhon | 来源:发表于2020-03-10 16:56 被阅读0次

    - 定义

    定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。

    - 主要角色

    • 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
    • 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
    • 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
    • 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

    - 结构图

    3-1Q1161I532V0.gif

    - 开发中的场景

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

    - 实例:部门间的协调:经理

    财务部、市场部、研发部。财务部要发工资,让大家核对公司需要跟市场部和研发部都通气;市场部要接个新项目,需要研发部处理技术、需要财务部出资金。市场部跟各个部门打交道。 虽然只有三个部门,但是关系非常乱。实际上,公司都有总经理。各个部门有什么事情都通报到总经理这里,总经理再通知各个相关部门。

    • 定义中介者接口
    public interface Mediator {
        
        /**
         * 注册 同事
         * @param dname
         * @param d
         */
        void register(String dname,Department d);
        
        /**
         * 执行 处理
         * @param dname
         */
        void command(String dname);
    }
    
    • 中介者实现类
    public class President implements Mediator {
        
        private Map<String,Department> map = new HashMap<String , Department>();
        
        @Override
        public void command(String dname) {
            map.get(dname).selfAction();
        }
    
        @Override
        public void register(String dname, Department d) {
            map.put(dname, d);
        }
    }
    
    • 定义同事接口

    市场部

    public class Market implements Department {
    
        private Mediator m;  //持有中介者(总经理)的引用
        
        public Market(Mediator m) {
            super();
            this.m = m;
            m.register("market", this);
        }
    
        @Override
        public void outAction() {
            System.out.println("汇报工作!项目承接的进度,需要资金支持!");
            
            m.command("finacial");
            
        }
    
        @Override
        public void selfAction() {
            System.out.println("跑去接项目!");
        }
    }
    

    财务部

    public class Financial implements Department {
    
        private Mediator m;  //持有中介者(总经理)的引用
        
        public Financial(Mediator m) {
            super();
            this.m = m;
            m.register("finacial", this);
        }
    
        @Override
        public void outAction() {
            System.out.println("汇报工作!没钱了,钱太多了!怎么花?");
        }
    
        @Override
        public void selfAction() {
            System.out.println("数钱!");
        }
    
    }
    

    开发部

    public class Development implements Department {
    
        private Mediator m;  //持有中介者(总经理)的引用
        
        public Development(Mediator m) {
            super();
            this.m = m;
            m.register("development", this);
        }
    
        @Override
        public void outAction() {
            System.out.println("汇报工作!没钱了,需要资金支持!");
        }
    
        @Override
        public void selfAction() {
            System.out.println("专心科研,开发项目!");
        }
    
    }
    

    调用

    public class Client {
        public static void main(String[] args) {
            // 获取中介者对象
            Mediator m = new President();
            // 获取同事对象,实例化的时候会在中介者对象中注册
            Market   market = new Market(m);
            Development devp = new Development(m);
            Financial f = new Financial(m);
            
                  //后面就可以用m来实施指挥调动了
        }
    }
    

    相关文章

      网友评论

          本文标题:中介者模式(Mediator)

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