中介者模式-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 @   diameter  阅读(126)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示