设计模式(二十二):中介者模式(Mediator Pattern)

Published on 2024-04-11 13:24 in 分类: 博客 with 狂盗一枝梅
分类: 博客

一、中介者模式定义

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

中介者模式是一种行为设计模式,它通过封装一系列对象之间的交互,将对象之间的复杂关系转移到一个中介者对象中。中介者模式通过减少对象之间的直接通信,促进了对象间的松耦合,并提供了一种集中式的控制方式。

以下是中介者模式的几个关键角色:

  • 中介者(Mediator):定义了对象之间通信的接口。中介者对象控制和协调其他对象之间的交互,并封装了对象间的复杂关系。
  • 具体中介者(Concrete Mediator):实现了中介者接口,具体中介者对象通过协调各个相关对象之间的交互来完成特定的行为。
  • 同事类(Colleague):表示参与中介者模式的对象。每个同事类都知道中介者对象,并通过中介者对象与其他同事类进行通信。

中介者模式通用类图如下所示

中介者模式-中介者模式通用类图

举例说明下中介者模式:现实生活中的中介者模式,比较典型的是飞机与塔台的例子,多架飞机飞到机场上空都想要降落,如果没有塔台,没架飞机都要和其他飞机协商下谁先降落,结果就是商量了一个小时,都在天上干瞪眼谁也下不来;有了塔台,那就好办了,塔台接收每架飞机的降落请求,然后给他们合理安排降落次序。如果有问题(比如某架飞机要先降落),塔台和飞机单独协商,而不是飞机与飞机之间协商。这样,飞机可以按序依次完成降落。

二、中介者模式案例

下面是一个使用中介者模式实现多飞机降落过程中的塔台作为中介者的Java示例

创建中介者接口ATCMediator

// 中介者接口
interface ATCMediator {
    void registerAircraft(Aircraft aircraft);
    void sendLandingRequest(Aircraft aircraft);
    boolean isLandingOk();
}

具体中介类

class ATCTower implements ATCMediator {
    private List<Aircraft> aircraftList;

    public ATCTower() {
        this.aircraftList = new ArrayList<>();
    }

    public void registerAircraft(Aircraft aircraft) {
        aircraftList.add(aircraft);
    }

    public void sendLandingRequest(Aircraft aircraft) {
        if (isLandingOk()) {
            System.out.println("Landing request approved for " + aircraft.getName());
        } else {
            System.out.println("Landing request denied for " + aircraft.getName());
        }
    }

    public boolean isLandingOk() {
        return aircraftList.isEmpty();
    }
}

飞机类

abstract class Aircraft {
    protected ATCMediator mediator;
    protected String name;

    public Aircraft(ATCMediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }

    public abstract void sendLandingRequest();
    public abstract void receiveLandingResponse(boolean permission);
    public String getName() {
        return name;
    }
}

具体飞机类

class Airplane extends Aircraft {
    public Airplane(ATCMediator mediator, String name) {
        super(mediator, name);
    }

    public void sendLandingRequest() {
        System.out.println("Requesting landing permission for " + name);
        mediator.sendLandingRequest(this);
    }

    public void receiveLandingResponse(boolean permission) {
        if (permission) {
            System.out.println(name + " has received landing permission");
        } else {
            System.out.println(name + " has been denied landing permission");
        }
    }
}

客户端代码

public class Main {
    public static void main(String[] args) {
        ATCTower tower = new ATCTower();

        Airplane airplane1 = new Airplane(tower, "Airplane 1");
        Airplane airplane2 = new Airplane(tower, "Airplane 2");
        Airplane airplane3 = new Airplane(tower, "Airplane 3");

        tower.registerAircraft(airplane1);
        tower.registerAircraft(airplane2);
        tower.registerAircraft(airplane3);

        airplane1.sendLandingRequest();
        airplane2.sendLandingRequest();
        airplane3.sendLandingRequest();
    }
}

在上述示例中,首先定义了中介者接口 ATCMediator,它声明了注册飞机和发送降落请求的方法。然后我们创建了具体的中介者类 ATCTower,它实现了中介者接口,并维护了一个飞机列表来管理已注册的飞机。

执行结果如下

Requesting landing permission for Airplane 1
Landing request approved for Airplane 1
Airplane 1 has received landing permission
Requesting landing permission for Airplane 2
Landing request denied for Airplane 2
Airplane 2 has been denied landing permission
Requesting landing permission for Airplane 3
Landing request denied for Airplane 3
Airplane 3 has been denied landing permission

飞机1先注册,那塔台优先让飞机1降落,其它飞机排队等候。

中介者模式用的更多的是在UI编程方面,它是个比较简单的模式。此处案例只是为了方便演示中介者模式是怎样的,在实际开发中不具有代表性。


参考文档:https://refactoringguru.cn/design-patterns/mediator



END.


#设计模式
目录