中介者模式

先看图:
图一
              图一
 图二
              图二
 这里写图片描述
              图三

  在大公司中,部门越完善,同事之间的关系就越复杂,就比如说你要申请买某个办公设备,需要你领导同意,然后找采购部门同事,采购部门同事需要找财务部门同事,最后买好了才下发到你手上,整个流程之间涉及到多个部门,关系复杂,同事之间涉及越多就越像蜘蛛网,如图一、二所示。

我们加入了中介者就可以让他们之间的关系简单化,如图三。这就是中介模式。

中介者模式定义
  中介者模式:Define an object that encapsulates how a set of objects interact mediator prometes loose coupling by keeping objects from refering to each other explicitly,and it lets you vary their interaction independtly.(用一个中介对象封装一系列的对象交互,中介者使各个对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变他们之间的交互。)

中介者模式中的角色
  Mediator抽象中介者角色
  抽象中介者角色定义统一的接口,用于各部门之间的通信。
  Concrete Mediator 具体中介者角色
  具体中介者角色通过协调各种角色实现协作行为,因此他必须依赖于各个同事角色。
  Colleague同事角色
  每个同事角色都需要知道中介者角色,而且与其他的同事角色通信的时候,一定要中介者角色协作。

下面来看实例代码:
  公司正常上班都会有群聊来发送通知或者讨论问题,就以群聊过程来演示中介者模式(服务器相当于中介者)。
抽象中介者:

public  interface Mediator
{
        //同事登录群聊系统
        public  void login(Colleague colleague);
        //发送消息到每个同事
        public  void dispatch(Colleague colleague,String msg);
}

具体中介者:

public class ConcreteMediator implements Mediator
{
     private ArrayList<Colleague> userList=new ArrayList<Colleague>();  
    @Override
    public void login(Colleague colleague)
    {
        // TODO Auto-generated method stub
        if (colleague!=null && !userList.contains(colleague)) {
            userList.add(colleague);
        }
    }

    @Override
    public void dispatch(Colleague colleague, String msg)
    {
        // TODO Auto-generated method stub
        for(Colleague c : userList)
        {
             if(!c.equals(colleague)){  
                    c.receiveMessage(msg);  
                }  
        }
    }

}

抽象同事:

public  abstract class Colleague
{
        private Mediator mediator;  
        private String name;  

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

        public String getName() {  
            return name;  
        }  
        //接受消息  
        public void receiveMessage(String msg){  
            System.out.println(this.name+"收到消息:"+msg);  
        }  
        //发送消息 
        public void sendMessage(String msg){  
            System.out.println(this.name+"说:"+msg);  
            mediator.dispatch(this,msg);  
        }  
}

同事张三:

public class Zhangsan extends Colleague
{

    public ColleagueA(String name, Mediator mediator)
    {
        super(name, mediator);
        // TODO Auto-generated constructor stub
        mediator.login(this);
    }

}

同事李四:

public class Lisi extends Colleague
{

    public ColleagueA(String name, Mediator mediator)
    {
        super(name, mediator);
        // TODO Auto-generated constructor stub
        mediator.login(this);
    }

}

同事王五:

public class Wangwu extends Colleague
{

    public ColleagueA(String name, Mediator mediator)
    {
        super(name, mediator);
        // TODO Auto-generated constructor stub
        mediator.login(this);
    }

}

场景类:

public class Client
{
        public static void main(String[] args) {  
            Mediator mediator=new ConcreteMediator();  
           Zhangsan zhangsan =new ColleagueA("张三", mediator);  
           Lisi lisi =new ColleagueB("李四", mediator);  
           Wangwu wangwu =new ColleagueC("王五", mediator);  

            zhangsan.sendMessage("项目完美上线!");  
            System.out.println("---------");  
            lisi.sendMessage("大家辛苦了!");  
            System.out.println("---------");  
            wangwu.sendMessage("领导辛苦了!");  
        }  
}

运行结果:

张三说:项目完美上线!
李四收到消息:项目完美上线!
王五收到消息:项目完美上线!
---------
李四说:大家辛苦了!
张三收到消息:大家辛苦了!
王五收到消息:大家辛苦了!
---------
王五说:领导辛苦了!
张三收到消息:领导辛苦了!
李四收到消息:领导辛苦了!

中介者优点
  减少类间的依赖,把原有的一对多的依赖变成一对一的依赖,同事类只依赖中介者,减少了依赖,当然也降低了类间的耦合。
中介者缺点
  中介者会膨胀的很大,而且逻辑复杂,同事越多,中介者逻辑越复杂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值