设计模式学习(十四) 中介者模式

场景:

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

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

 

核心:

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

  -- 我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为如下的星状结构

代码:

 

package meidiator;

//中介者接口
public interface Mediator {
    
        void register(String dname,Department d);
        
        void command(String dname);
        
}
中介者接口

 

package meidiator;

//同事类接口
public interface Department {

    void selfAction(); // 做本部门的事情
    
    void outAction(); // 向总经理发出请求
}
部门接口

 

package meidiator;

public class Market implements Department{

    private Mediator m;//持有中介者(总经理)的引用
    
    public Market(Mediator m) {
        super();
        this.m = m;
        m.register("market", this);
    }

    @Override
    public void selfAction() {
        System.out.println("赶进度");
        
        
        
    }

    @Override
    public void outAction() {
        System.out.println("汇报工作,项目进度...而且缺钱了");
        
        m.command("finacial");
        
    }

    
}
市场部

 

package meidiator;

public class Finacial implements Department{

    private Mediator m;//持有中介者(总经理)的引用
    
    public Finacial(Mediator m) {
        super();
        this.m = m;
        m.register("finacial", this);
    }

    @Override
    public void selfAction() {
        
        System.out.println("数钱");
        
    }

    @Override
    public void outAction() {
        
        System.out.println("汇报工作,钱好多,怎么花");
        
    }

    
}
财务部

 

package meidiator;

public class Development implements Department{

    private Mediator m;//持有中介者(总经理)的引用
    
    public Development(Mediator m) {
        super();
        this.m = m;
        m.register("development", this);
    }

    @Override
    public void selfAction() {
        
        System.out.println("专业科研,开发项目");
            
    }

    @Override
    public void outAction() {
        
        System.out.println("汇报工作,没钱了,需要资金");
        
    }

    
}
研发部

 

package meidiator;

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

public class President implements Mediator {

    private Map<String,Department> map= new HashMap<String , Department>();
    
    @Override
    public void register(String dname, Department d) {
        map.put(dname,d);
        
    }

    @Override
    public void command(String dname) {
        map.get(dname).selfAction();
        
    }
    

}
经理(中介者)实现

 

package meidiator;

public class Client {
    public static void main(String[] args){
        
        Mediator m = new President();
        
        Market market = new Market(m);
        Development devp = new Development(m);
        Finacial f = new Finacial(m);
        
        market.selfAction();
        market.outAction();
    }
}
客户端

 

优点:

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

开发场景:

posted @ 2015-04-20 18:57  李_鹏  阅读(160)  评论(0编辑  收藏  举报