c++设计模式概述之中介

代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做。

 

1、概述

  A、中介模式,主要对象有两类: 中介和用户,类比生活中的房产中介公司,中介手中掌握着用户的资料,当然,用户手中也有中介的联系方式。 

  B、想象下,当中介收到用户的更新,会将消息转达给需要的用户手中。

  C、还有,在线聊天,需要服务器和用户。 大家现在服务器注册,然后再登陆聊天,用户A发送消息,服务器收到,再将消息转发到目的地。

  D、这样的模式和今天要概述的中介模式很相似。

  E、下面以房产中介和用户为例。

 

2、抽象用户

// 抽象客户类
class oct_client
{
public:
    // 登记中介
    virtual void set_medium(oct_medium* pinstance)
    {
        if (pinstance)
            _pmedium = pinstance;
    }

    virtual void send() = 0;
    virtual void recv() = 0;

protected:
    // 中介公司
    oct_medium *_pmedium = nullptr;
};

 

3、抽象中介

// 抽象中介公司
class oct_medium
{
public:
    // 客户需要注册
    virtual void set_down(oct_client *pinstance) = 0;
    // 当有变化时,即时通知客户
    virtual void relay(oct_client* psrc) = 0;
};

 

4、具体用户A

// 具体的客户
class oct_client_A : public oct_client
{
public:
    void send()
    {
        std::cout << "\n客户A发出请求\n";
        // 请求发到中介手中,中介需要转发出去
        if (_pmedium)
            _pmedium->relay(this);
    }

    void recv()
    {
        std::cout << "\n客户A收到中介转发的消息\n";
    }
};

 

5、具体用户B

// 客户B
class oct_client_B : public oct_client
{
public:
    void send()
    {
        std::cout << "\n客户B发出请求\n";
        // 请求发到中介手中,中介需要转发出去
        if (_pmedium)
            _pmedium->relay(this);

    }

    void recv()
    {
        std::cout << "\n客户B收到中介转发的消息\n";
    }
};

 

6、具体中介公司

// 具体哪一家中介公司
class oct_medium_A : public oct_medium
{
public:
    // 将联系人的信息的登记到自己的小本子中
    void set_down(oct_client *pinstance)
    {
        if (pinstance)
        {
            _list_client.push_back(pinstance);

            // 双向的,客户也需要知道中介的信息
            pinstance->set_medium(this);
        }
    }

    // 中介转发,发给客户
    void relay(oct_client* psrc)
    {
        if (!psrc)
        {
            std::cout << "\n目标联系人为空,无法完成转发\n";
            return;
        }

        for each(auto item in _list_client)
        {
            // 将收到的信息转发给其他用户
            if (psrc != item)
                item->recv();
        }
        
    }

private:
    // 中介,中间人,手上有大把大把联系人信息
    std::list<oct_client*> _list_client;
};

 

7、调用示例

 1 void call_medium()
 2 {
 3     // 创建客户和中介
 4     std::unique_ptr<oct_client> pclientA(new(std::nothrow) oct_client_A);
 5     std::unique_ptr<oct_client> pclientB(new(std::nothrow) oct_client_B);
 6     std::unique_ptr<oct_medium> pmediumA(new(std::nothrow) oct_medium_A);
 7 
 8     if (!pclientB || !pclientA || !pmediumA)
 9     {
10         std::cout << "\n创建中介和客户失败\n";
11         return;
12     }
13     // -------------------------------------------------------------------------------
14     // 1、客户登记中介信息
15     pclientA->set_medium(pmediumA.get());
16     pclientB->set_medium(pmediumA.get());
17 
18     // 中介登记客户信息
19     pmediumA->set_down(pclientA.get());
20     pmediumA->set_down(pclientB.get());
21 
22     // 2、客户A请求中介转发
23     std::cout << "\n1、客户A请求中介转发\n";
24     pclientA->send();
25 
26     // 3、客户B请求中介转发
27     std::cout << "\n\n\n\n--------------------------------\n\n2、客户B请求中介转发\n";
28     pclientB->send();
29 
30 }

 

 

8、输出结果

 

posted @ 2020-08-14 19:40  mohist  阅读(153)  评论(0编辑  收藏  举报