设计模式(023)行为型之中介者模式

中介者模式是一种行为型设计模式,用于减少对象之间的直接通信,而是通过一个中介对象来进行间接通信。这种模式有助于减少对象之间的耦合,使得系统更易于维护和扩展。

在中介者模式中,主要有以下几个角色:
① 中介者(Mediator) :定义了一个接口用于各个同事对象之间的通信,并负责实现具体的协调逻辑。
② 具体中介者(ConcreteMediator) :实现了中介者接口,负责协调各个同事对象之间的通信。
③ 同事类(Colleague) :每个同事类都知道中介者对象,并通过中介者对象来通信,而不是直接与其他同事对象通信。
④ 具体同事类(ConcreteColleague) :实现了同事类接口,每个具体同事类都需要知道中介者对象,并通过中介者对象来进行通信。

中介者模式通常应用于多个对象之间存在复杂的交互关系,通过引入中介者对象来简化对象之间的通信,降低耦合度,同时也使得系统更易于理解和扩展。

1、场景设计

实现场景:A、B两个同事通过中介者进行消息收发。

2、C++实现

`Colleague` 是同事类接口,定义了同事对象的基本行为。`ConcreteColleagueA` 和 `ConcreteColleagueB` 是具体的同事类,实现了同事类接口。`Mediator` 是中介者类接口,定义了中介者对象的基本行为。`ConcreteMediator` 是具体的中介者类,负责协调不同同事类之间的通信。在 `main` 函数中,我们创建了中介者对象和两个具体同事对象,并设置了中介者对象的引用,然后通过同事对象发送消息,中介者对象负责转发消息给其他同事对象。

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>

// 前置声明
class Mediator;

// 同事类接口
class Colleague {
    protected:
        Mediator* mediator;

    public:
        Colleague(Mediator* mediator) : mediator(mediator) {}

        virtual void send(const std::string& message) = 0;
        virtual void receive(const std::string& message) = 0;
};

// 中介者类接口
class Mediator {
    public:
        virtual void send(const std::string& message, Colleague* colleague) = 0;
};


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

        void send(const std::string& message) override {
            mediator->send(message, this);
        }

        void receive(const std::string& message) override {
            std::cout << "ConcreteColleagueA received: " << message << std::endl;
        }
};

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

        void send(const std::string& message) override {
            mediator->send(message, this);
        }

        void receive(const std::string& message) override {
            std::cout << "ConcreteColleagueB received: " << message << std::endl;
        }
};


// 具体中介者类
class ConcreteMediator : public Mediator {
    private:
        ConcreteColleagueA* colleagueA;
        ConcreteColleagueB* colleagueB;

    public:
        void setColleagueA(ConcreteColleagueA* colleagueA) {
            this->colleagueA = colleagueA;
        }

        void setColleagueB(ConcreteColleagueB* colleagueB) {
            this->colleagueB = colleagueB;
        }

        void send(const std::string& message, Colleague* colleague) override {
            if (colleague == colleagueA) {
                colleagueB->receive(message);
            } else if (colleague == colleagueB) {
                colleagueA->receive(message);
            }
        }
};

int main() {
    ConcreteMediator mediator;

    ConcreteColleagueA colleagueA(&mediator);
    ConcreteColleagueB colleagueB(&mediator);

    mediator.setColleagueA(&colleagueA);
    mediator.setColleagueB(&colleagueB);

    colleagueA.send("Hello from colleague A");
    colleagueB.send("Hi from colleague B");

    return 0;
}

3、Java实现

`Mediator` 是中介者接口,定义了中介者对象的基本行为。`Colleague` 是同事类抽象类,定义了同事对象的基本行为。`ConcreteColleagueA` 和 `ConcreteColleagueB` 是具体的同事类,实现了同事类抽象类。`ConcreteMediator` 是具体的中介者类,负责协调不同同事类之间的通信。在 `main` 方法中,我们创建了中介者对象和两个具体同事对象,并将同事对象添加到中介者对象中,然后通过同事对象发送消息,中介者对象负责转发消息给其他同事对象。

java 复制代码
package behavioralpattern.mediator;

import java.util.ArrayList;
import java.util.List;

// 中介者接口
interface Mediator {
    void sendMessage(String message, Colleague colleague);
}

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

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

    public abstract void sendMessage(String message);

    public abstract void receiveMessage(String message);
}

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

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

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

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

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

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

// 具体中介者类
class ConcreteMediator implements Mediator {
    private List<Colleague> colleagues = new ArrayList<>();

    public void addColleague(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void sendMessage(String message, Colleague colleague) {
        for (Colleague c : colleagues) {
            if (c != colleague) {
                c.receiveMessage(message);
            }
        }
    }
}

public class MediatorDemo {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();

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

        mediator.addColleague(colleagueA);
        mediator.addColleague(colleagueB);

        colleagueA.sendMessage("Hello from colleague A");
        colleagueB.sendMessage("Hi from colleague B");
    }
}
相关推荐
蜡笔小新..4 小时前
【设计模式】软件设计原则——开闭原则&里氏替换&单一职责
java·设计模式·开闭原则·单一职责原则
性感博主在线瞎搞5 小时前
【面向对象】设计模式概念和分类
设计模式·面向对象·中级软件设计师·设计方法
lucifer3115 小时前
JavaScript 中的装饰器模式(十一)
javascript·设计模式
蜡笔小新..6 小时前
【设计模式】软件设计原则——依赖倒置&合成复用
设计模式·依赖倒置原则·合成复用原则
刷帅耍帅6 小时前
设计模式-代理模式
设计模式·代理模式
神的孩子都在歌唱14 小时前
行为设计模式 -观察者模式- JAVA
java·观察者模式·设计模式
刷帅耍帅18 小时前
设计模式-解释器模式
设计模式·解释器模式
刷帅耍帅18 小时前
设计模式-备忘录模式
设计模式·备忘录模式
anyup_前端梦工厂1 天前
JS设计模式之状态模式:优雅地管理应用中产生的不同状态
前端·javascript·设计模式