【地铁上的设计模式】--行为型模式:中介者模式

2023-05-11 17:57:00 浏览数 (1)

什么是中介者模式

中介者模式是一种行为设计模式,它允许将对象之间的通信封装到一个中介者对象中。在这种模式中,对象不再直接相互通信,而是通过中介者进行交互。这可以降低对象之间的耦合度,并使代码更易于维护和扩展。 中介者模式通常用于需要大量对象相互交互的场景,例如GUI应用程序或多人游戏。通过将所有对象的通信集中在中介者中,可以更好地控制和管理系统中的交互行为。此外,中介者模式还可以支持系统中的松耦合设计,从而更容易地扩展和修改系统中的对象和行为。

如何实现中介者模式

中介者模式的实现步骤如下:

  1. 定义中介者接口:中介者接口定义了各个组件之间通信的协议。
  2. 定义组件接口:组件接口定义了组件需要实现的方法,以便中介者对象调用。
  3. 定义具体组件类:实现组件接口中定义的方法,并在需要通信时使用中介者对象调用其他组件的方法。
  4. 定义具体中介者类:实现中介者接口中定义的协议,并持有所有组件的引用,以便在接收到消息时转发给其他组件。
  5. 创建组件对象:创建需要进行通信的组件对象,并将它们传递给中介者对象。
  6. 将中介者对象传递给组件对象:将中介者对象传递给各个组件对象,以便它们在需要通信时调用中介者对象的方法。
  7. 调用组件方法:在需要通信时,各个组件对象调用中介者对象的方法,以便中介者对象将消息转发给其他组件。
  8. 修改中介者类:如果需要增加新的组件或修改通信协议,只需要修改中介者类即可。

Tip:中介者模式会增加对象之间的耦合性,因为各个组件对象都需要知道中介者对象的存在。但是,它可以降低系统的复杂度,因为各个组件对象不再需要知道其他组件对象的存在,只需要知道中介者对象即可。此外,中介者模式也可以方便地扩展系统,因为新增加组件或修改通信协议只需要修改中介者类即可。

Java实现 以下是 Java 中介者模式的代码实现:

代码语言:javascript复制
// 中介者接口
public interface Mediator {
    void sendMessage(String message, Colleague colleague);
}

// 具体中介者
public class ConcreteMediator implements Mediator {
    private ColleagueA colleagueA;
    private ColleagueB colleagueB;
    
    public void setColleagueA(ColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }
    
    public void setColleagueB(ColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }
    
    @Override
    public void sendMessage(String message, Colleague colleague) {
        if (colleague == colleagueA) {
            colleagueB.notify(message);
        } else {
            colleagueA.notify(message);
        }
    }
}

// 抽象同事类
public abstract class Colleague {
    protected Mediator mediator;
    
    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
    
    public abstract void send(String message);
    
    public abstract void notify(String message);
}

// 具体同事类A
public class ColleagueA extends Colleague {
    public ColleagueA(Mediator mediator) {
        super(mediator);
    }
    
    @Override
    public void send(String message) {
        mediator.sendMessage(message, this);
    }
    
    @Override
    public void notify(String message) {
        System.out.println("ColleagueA receive message: "   message);
    }
}

// 具体同事类B
public class ColleagueB extends Colleague {
    public ColleagueB(Mediator mediator) {
        super(mediator);
    }
    
    @Override
    public void send(String message) {
        mediator.sendMessage(message, this);
    }
    
    @Override
    public void notify(String message) {
        System.out.println("ColleagueB receive message: "   message);
    }
}

在这个例子中,Mediator 是中介者接口,定义了 sendMessage 方法。ConcreteMediator 是具体中介者,实现了 sendMessage 方法。Colleague 是抽象同事类,包含一个中介者对象和 sendnotify 两个抽象方法。ColleagueAColleagueB 是具体同事类,实现了 sendnotify 方法。 当 ColleagueA 发送消息时,通过中介者 ConcreteMediator 将消息发送给 ColleagueB。反之亦然。这样,同事类之间不再直接进行交互,而是通过中介者进行交互。

C#实现 以下是 C# 中介者模式的一个简单实现示例:

代码语言:javascript复制
using System;
using System.Collections.Generic;

// 抽象中介者类
public abstract class Mediator
{
    public abstract void Send(string message, Colleague colleague);
}

// 抽象同事类
public abstract class Colleague
{
    protected Mediator mediator;

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

    public virtual void Send(string message)
    {
        mediator.Send(message, this);
    }

    public abstract void Notify(string message);
}

// 具体中介者类
public class ConcreteMediator : Mediator
{
    private Dictionary<string, Colleague> colleagues = new Dictionary<string, Colleague>();

    public override void Send(string message, Colleague colleague)
    {
        foreach (var col in colleagues.Values)
        {
            if (col != colleague)
            {
                col.Notify(message);
            }
        }
    }

    public void Register(string name, Colleague colleague)
    {
        colleagues.Add(name, colleague);
    }
}

// 具体同事类
public class ConcreteColleagueA : Colleague
{
    public ConcreteColleagueA(Mediator mediator) : base(mediator)
    {
    }

    public override void Notify(string message)
    {
        Console.WriteLine("同事 A 得到消息:"   message);
    }
}

// 具体同事类
public class ConcreteColleagueB : Colleague
{
    public ConcreteColleagueB(Mediator mediator) : base(mediator)
    {
    }

    public override void Notify(string message)
    {
        Console.WriteLine("同事 B 得到消息:"   message);
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        ConcreteMediator mediator = new ConcreteMediator();

        ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
        ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);

        mediator.Register("colleagueA", colleagueA);
        mediator.Register("colleagueB", colleagueB);

        colleagueA.Send("吃饭了吗?");
        colleagueB.Send("没有呢,你打算请客?");

        Console.ReadKey();
    }
}

在该示例中,中介者 Mediator 负责协调具体同事类 ConcreteColleagueAConcreteColleagueB 的通信。当其中一个同事发送消息时,中介者会将消息发送给其他同事,而不是直接将消息发送给目标同事。这样,每个同事都不需要知道其他同事的存在,从而实现了松耦合。 值得注意的是,具体中介者类 ConcreteMediator 必须知道具体同事类的存在,因此需要对每个具体同事类进行注册。这是该模式的一个缺点,因为增加或删除同事类需要修改中介者类,可能会导致系统的维护困难。

总结

中介者模式是一种行为型设计模式,它允许将多个对象间的交互行为集中到一个中介者对象中,从而使得各个对象间的耦合度降低,且易于维护和扩展。中介者模式适用于对象间的交互行为变得复杂时,可以将其抽象为中介者对象,使得各个对象间只需与中介者交互而不需要知道其它对象的存在。中介者模式可以提高系统的灵活性、可维护性和可扩展性。同时,中介者模式也存在一些缺点,如可能导致中介者对象变得过于复杂,且增加了系统的开销。 优点: 1.减少对象间的耦合度,提高系统的灵活性和可维护性; 2.把对象间的交互行为抽象成中介者对象,简化了对象间的交互方式; 3.易于扩展和维护,增加新的对象只需要修改中介者对象即可,无需修改其它对象。

缺点: 1.可能导致中介者对象变得过于复杂,难以维护和扩展; 2.增加了系统的开销,因为中介者对象需要处理其它对象的交互行为; 3.可能降低系统的性能,因为中介者对象需要处理大量的交互行为。

0 人点赞