(三)行为模式:5、中介者模式(Mediator Pattern)(C++示例)

目录

1、中介者模式(Mediator Pattern)含义

2、中介者模式的UML图学习

3、中介者模式的应用场景

4、中介者模式的优缺点

(1)优点

(2)缺点

5、C++实现中介者模式的实例


1、中介者模式(Mediator Pattern)含义

中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互吸引,从而使其耦合松散,而且可以独立地改变它们之间地交互。【DP】

中介者模式是一种行为型设计模式,它通过引入一个中介者对象来协调多个相关对象之间的交互。中介者模式将对象之间的通信封装在中介者对象中,从而降低了对象之间的耦合性。

2、中介者模式的UML图学习

中介者模式的几个角色:

(1)中介者(Mediator):定义了各个相关对象之间通信的接口,通常包括发送消息、注册和移除对象等方法。

(2)具体中介者(Concrete Mediator):实现中介者接口,协调各个相关对象之间的通信。

(3)同事类(Colleague):定义了各个相关对象的接口,包括发送消息、接收消息等方法。

(4)具体同事类(Concrete Colleague):实现同事类接口,与其他同事类进行通信。

3、中介者模式的应用场景

(1)系统中对象之间存在复杂的交互关系,导致每个对象都需要与多个其他对象进行通信。

(2)对象之间的交互逻辑较为复杂,难以维护和理解。

(3)希望减少对象之间的直接依赖关系,提高系统的可扩展性和灵活性。

4、中介者模式的优缺点

(1)优点

        1)减少了对象之间的直接依赖:中介者模式将对象之间的通信逻辑封装在中介者对象中,使得对象之间不需要直接引用彼此,从而降低了对象之间的耦合性。

        2)简化了对象之间的交互:中介者模式集中了对象之间的交互逻辑,使得交互变得简单明确。

        3)提高了系统的可扩展性:由于对象之间的通信逻辑集中在中介者对象中,新增或修改一个相关对象不会影响其他对象。

(2)缺点

        1)中介者对象可能变得复杂:随着系统中对象之间交互关系的增加,中介者对象可能变得庞大复杂。

        2)违反了单一职责原则:中介者对象承担了协调各个对象之间通信的责任,可能导致其职责过重。

5、C++实现中介者模式的实例


#include <iostream>
#include <string>

class Colleague;

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

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

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

    virtual void receiveMessage(const std::string& message) = 0;
    virtual void sendMessage(const std::string& message) = 0;
};

// 具体中介者
class ConcreteMediator : public Mediator 
{
private:
    Colleague* colleague1;
    Colleague* colleague2;

public:
    void setColleague1(Colleague* col) 
    {
        colleague1 = col;
    }

    void setColleague2(Colleague* col) 
    {
        colleague2 = col;
    }

    void sendMessage(const std::string& message, Colleague* colleague) override 
    {
        if (colleague == colleague1) 
        {
            colleague2->receiveMessage(message);
        }
         else if (colleague == colleague2) 
        {
            colleague1->receiveMessage(message);
        }
    }
};

// 具体同事类
class ConcreteColleague1 : public Colleague 
{
public:
    explicit ConcreteColleague1(Mediator* med) : Colleague(med) {}

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

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

class ConcreteColleague2 : public Colleague 
{
public:
    explicit ConcreteColleague2(Mediator* med) : Colleague(med) {}

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

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

int main() 
{
    ConcreteMediator mediator;
    ConcreteColleague1 colleague1(&mediator);
    ConcreteColleague2 colleague2(&mediator);

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

    colleague1.sendMessage("Hello, colleague2!");
    colleague2.sendMessage("Hi, colleague1!");

    return 0;
}

在上述示例中,我们定义了中介者接口Mediator和具体中介者ConcreteMediator,以及同事类Colleague和具体同事类ConcreteColleague。通过实现这些接口和类,我们可以创建一个中介者对象来协调两个同事对象之间的通信。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中介者模式是一种行为设计模式,它允许多个对象之间通过中介对象进行通信和协作,而不是直接相互引用。在电商领域中,中介者模式可以用来协调买家、卖家、库存管理者和物流公司之间的交互。 在一个电商平台中,买家需要与卖家达成交易,同时库存管理者需要知道哪些商品需要补充库存,物流公司需要知道哪些商品需要配送。传统的设计方法是让每个对象直接引用其他对象,这会导致高耦合度、难以扩展和维护。 使用中介者模式,我们可以引入一个中介者对象来协调这些对象之间的通信和协作。中介者对象可以提供以下功能: 1. 提供一个接口让买家和卖家进行交易,如下单、付款、发货等。这样买家和卖家不需要直接引用对方,只需要与中介者对象通信即可。 2. 提供一个接口让库存管理者和物流公司获取需要补充库存和配送的商品信息。这样库存管理者和物流公司也不需要直接引用其他对象,只需要与中介者对象通信即可。 下面是一个简单的电商平台中介者模式示例代码: ```java // 中介者接口 public interface Mediator { void buy(Item item, int quantity); void sell(Item item, int quantity); void checkStock(); void ship(Item item, int quantity); } // 电商平台中介者对象 public class EcommerceMediator implements Mediator { private Map<Item, Integer> stock = new HashMap<>(); @Override public void buy(Item item, int quantity) { if (stock.getOrDefault(item, 0) >= quantity) { System.out.println("买家购买了 " + quantity + " 个 " + item.getName() + "。"); stock.put(item, stock.get(item) - quantity); } else { System.out.println(item.getName() + " 库存不足,无法购买。"); } } @Override public void sell(Item item, int quantity) { System.out.println("卖家出售了 " + quantity + " 个 " + item.getName() + "。"); stock.put(item, stock.getOrDefault(item, 0) + quantity); } @Override public void checkStock() { System.out.println("当前库存:"); for (Map.Entry<Item, Integer> entry : stock.entrySet()) { System.out.println(entry.getKey().getName() + ":" + entry.getValue()); } } @Override public void ship(Item item, int quantity) { System.out.println(item.getName() + " 已发货,数量:" + quantity); } } // 商品类 public class Item { private String name; private double price; public Item(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } } // 买家类 public class Buyer { private Mediator mediator; public Buyer(Mediator mediator) { this.mediator = mediator; } public void buy(Item item, int quantity) { mediator.buy(item, quantity); } } // 卖家类 public class Seller { private Mediator mediator; public Seller(Mediator mediator) { this.mediator = mediator; } public void sell(Item item, int quantity) { mediator.sell(item, quantity); } } // 库存管理者类 public class StockManager { private Mediator mediator; public StockManager(Mediator mediator) { this.mediator = mediator; } public void checkStock() { mediator.checkStock(); } } // 物流公司类 public class LogisticsCompany { private Mediator mediator; public LogisticsCompany(Mediator mediator) { this.mediator = mediator; } public void ship(Item item, int quantity) { mediator.ship(item, quantity); } } // 示例代码 public static void main(String[] args) { Mediator mediator = new EcommerceMediator(); Item item = new Item("手机", 999.99); Buyer buyer = new Buyer(mediator); Seller seller = new Seller(mediator); StockManager stockManager = new StockManager(mediator); LogisticsCompany logisticsCompany = new LogisticsCompany(mediator); seller.sell(item, 10); stockManager.checkStock(); buyer.buy(item, 3); stockManager.checkStock(); logisticsCompany.ship(item, 3); } ``` 在上面的示例代码中,我们创建了一个电商平台中介者对象 `EcommerceMediator`,并创建了买家、卖家、库存管理者和物流公司等对象,并将它们的中介者都设置为 `EcommerceMediator`。通过中介者对象,这些对象之间可以进行通信和协作,而不需要直接引用对方,从而实现了低耦合度、易扩展和维护的设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值