Java中介者模式(Mediator Pattern)

2023-07-19 13:50:13 java 模式 中介
介绍: 中介者模式是一种行为型设计模式,它通过将对象之间的交互集中到一个中介对象中来降低彼此之间的耦合度。在中介者模式中,多个对象之间的交互不再直接发生,而是通过中介者来协调处理。这种方式能够简化对象之间的通信,并且更容易扩展和维护系统。 1. 什么是中介者模式 中介者模式是一种行为型设计模式,它提供了一种解耦的机制,能够降低对象之间的直接耦合度。在中介者模式中,多个对象之间不再直接交互,而是通过一个中介者对象来进行协调。这个中介者对象负责处理对象之间的通信和协调行为,使得对象之间的关系更加灵活和可扩展。 中介者模式可以减少系统中对象之间的依赖关系,使得对象之间的通信更加简单和直接。当系统中的对象之间关系复杂且耦合度高时,可以考虑使用中介者模式进行重构,从而提高系统的可维护性和可扩展性。 2. 中介者模式的结构 中介者模式包含以下几个关键角色: - 抽象中介者(Mediator):定义了对象之间进行通信和协调的接口。 - 具体中介者(ConcreteMediator):实现了中介者接口,负责协调对象之间的通信。 - 抽象同事类(Colleague):定义了同事类的接口,包括同事类之间相互通信的方法。 - 具体同事类(ConcreteColleague):实现了同事类接口,负责具体业务逻辑,通过中介者与其他同事类进行通信。 3. 中介者模式的应用场景 中介者模式适用于以下场景: - 系统中的对象之间存在复杂的关联关系,导致对象之间的通信和协调逻辑复杂。 - 一个对象的行为依赖于其他多个对象,导致对象之间的耦合度高。 - 希望通过一个中介者来集中处理对象之间的交互逻辑,而不是分散到各个对象中。 - 为系统增加新的对象或者处理新的交互逻辑时,希望保持系统的灵活性和可扩展性。 4. 示例代码 下面是一个简单的示例代码,演示了中介者模式的使用:
// 抽象同事类
abstract class Colleague {
    protected Mediator mediator;

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

    public abstract void send(String message);
    public abstract void receive(String message);
}

// 具体同事类
class ConcreteColleague1 extends Colleague {
    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String message) {
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("ConcreteColleague1 received: " + message);
    }
}

class ConcreteColleague2 extends Colleague {
    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String message) {
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("ConcreteColleague2 received: " + message);
    }
}

// 抽象中介者
interface Mediator {
    void send(String message, Colleague colleague);
}

// 具体中介者
class ConcreteMediator implements Mediator {
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;

    public void setColleague1(ConcreteColleague1 colleague1) {
        this.colleague1 = colleague1;
    }

    public void setColleague2(ConcreteColleague2 colleague2) {
        this.colleague2 = colleague2;
    }

    @Override
    public void send(String message, Colleague colleague) {
        if (colleague == colleague1) {
            colleague2.receive(message);
        } else if (colleague == colleague2) {
            colleague1.receive(message);
        }
    }
}

public class MediatorPatternDemo {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
        ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);

        mediator.setColleague1(colleague1);
        mediator.setColleague2(colleague2);

        colleague1.send("Hello");
        colleague2.send("World");
    }
}
上述代码中,抽象同事类(Colleague)定义了同事类的接口,包括发送和接收消息的方法。具体同事类(ConcreteColleague1和ConcreteColleague2)继承了抽象同事类,并实现了具体的业务逻辑。抽象中介者(Mediator)定义了中介者的接口,并提供了发送消息的方法。具体中介者(ConcreteMediator)实现了中介者接口,并负责协调同事类之间的通信。在示例代码的main方法中,创建了中介者对象和两个具体同事类对象,并设置同事类对象的中介者,然后通过调用send方法发送消息。运行程序后,可以看到两个同事类对象通过中介者进行消息的交互。这样通过添加中介者对象,实现了同事类之间的解耦,使得系统更加灵活和可扩展。

相关文章