中介者模式-Mediator

名称:

    中介者模式(Mediator Pattern)-对象行为型模式

 

问题:

    The Mediator pattern simplifies communication among objects in a system by introducing a single object that manages message distribution among other objects. The Mediator pattern promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.    

    用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

 

适用性:

    -一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。

    -一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。

    -想定制一个分布在多个类中的行为,而又不想生成太多的子类。

 

协作:

    同事向一个中介者对象发送和接收请求。中介者在各同事间适当的转发请求以实现协作行为。

 

优点和缺点:

    1、减少了子类生成。

    2、它将各Colleague解耦。

    3、它简化了对象协议。

    4、它对对象如何协作进行了抽象。

    5、它使控制集中化。

方案:

    

1、 模式的参与者

    1、Mediator

    -中介者定义一个接口用于与各同事对象通信。

    2、ConcerteMediator

   -具体中介者通过协调各同事对象实现写协作行为。

    -了解并维护它的各个同事。

    3、Colleague class

    -每一个同事类都知道它的中介者对象。

    -每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。

 

2.实现方式

abstract class Mediator
{
    public abstract void register(Colleague colleague);
    public abstract void relay(Colleague cl); 
}
class ConcreteMediator extends Mediator
{
    private List<Colleague> colleagues=new ArrayList<Colleague>();
    public void register(Colleague colleague)
    {
        if(!colleagues.contains(colleague))
        {
            colleagues.add(colleague);
            colleague.setMedium(this);
        }
    }
    public void relay(Colleague cl)
    {
        for(Colleague ob:colleagues)
        {
            if(!ob.equals(cl))
            {
                ((Colleague)ob).receive();
            }   
        }
    }
}
abstract class Colleague
{
    protected Mediator mediator;
    public void setMedium(Mediator mediator)
    {
        this.mediator=mediator;
    }   
    public abstract void receive();   
    public abstract void send();
}
class ConcreteColleague1 extends Colleague
{
    public void receive()
    {
        System.out.println("Colleague1 receive。");
    }   
    public void send()
    {
        System.out.println("Colleague1 send。");
        mediator.relay(this); 
    }
}
class ConcreteColleague2 extends Colleague
{
    public void receive()
    {
        System.out.println("Colleague2 receive。");
    }   
    public void send()
    {
        System.out.println("Colleague2 send。");
        mediator.relay(this); 
    }
public class MediatorPattern
{
    public static void main(String[] args)
    {
        Mediator md=new ConcreteMediator();
        Colleague c1,c2;
        c1=new ConcreteColleague1();
        c2=new ConcreteColleague2();
        md.register(c1);
        md.register(c2);
        c1.send();
        System.out.println("-------------");
        c2.send();
    }
}

 

参考资料

《设计模式:可复用面向对象软件的基础》

posted @ 2020-06-30 18:42  diameter  阅读(124)  评论(0编辑  收藏  举报