zoukankan      html  css  js  c++  java
  • 中介者模式

    中介者(Mediator)模式

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

    主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

    应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

    代码:

    #include <iostream>
    #include <string>
    using namespace std;
    
    
    class Mediator;
    
    class Person
    {
    public:
        virtual ~Person() {}
    public:
        virtual void setMediator(Mediator *m) {}   // 设置中介
        virtual void sendMessage(string message){} // 发送消息
        virtual void getMessage(string message){} // 获取消息
    
    protected:
        Mediator *_mediator;
    };
    
    class Mediator
    {
    public:
        virtual ~Mediator() {}
    public:
        virtual void setLandlord(Person *p) {}  // 设置房东
        virtual void setRenter(Person *p) {}    // 设置租客
        virtual void sendMessage(string message, Person *p) {} // 转发消息
    };
    
    class Landlord : public Person
    {
    public:
        void setMediator(Mediator *m)
        {
            _mediator = m;
        }   
    
        void sendMessage(string message)
        {
            _mediator->sendMessage(message, this);
        } 
    
        void getMessage(string message)
        {
            cout << "房东收到租客发来的消息:" << message << endl;
        } 
    };
    
    class Renter : public Person
    {
    public:
        void setMediator(Mediator *m)
        {
            _mediator = m;
        }  
    
        void sendMessage(string message)
        {
            _mediator->sendMessage(message, this);
        } 
    
        void getMessage(string message)
        {
            cout << "租客收到房东发来的消息: " << message << endl;
        }
    };
    
    class HouseMediator : public Mediator
    {
    public:
        void setLandlord(Person *p)
        {
            _landlord = p;
        }
    
        void setRenter(Person *p)
        {
            _renter = p;
        }
    
        void sendMessage(string message, Person *p)
        {
            if (p == _landlord) // 房东发送信息
            {
                _renter->getMessage(message);
            }
            else   // 租客发送信息
            {
                _landlord->getMessage(message);
            }
        }
    
    private:
        Person *_landlord;  // 房东
        Person *_renter; // 租客
    };
    
    
    void test()
    {
        Mediator *mediator = new HouseMediator;  // 房屋中介
        Person *renter = new Renter;   // 租客
        Person *landlord = new Landlord;  // 房东
        mediator->setLandlord(landlord);
        mediator->setRenter(renter);
        renter->setMediator(mediator);
        landlord->setMediator(mediator);
    
        renter->sendMessage("我想在上海火车站附近租房子,一室一厅");
        landlord->sendMessage("我想出租一室一厅的房子,地点:上海火车站附近");
    
    
        delete mediator;
        delete renter;
        delete landlord;
    }
    
    int main()
    {
        test();
        cin.get();
        return 0;
    }

    效果:

  • 相关阅读:
    AX88772B 驱动移植
    USB 驱动之 usb_register 函数解析
    am335x USB 驱动框架记录
    warning: assignment from incompatible pointer type [enabled by default]
    WARNING: arch/arm/mach-omap2/built-in.o(.text+0x12cdc): Section mismatch in reference from the function mmc0_init() to the (unknown reference) .init.data:(unknown)
    Oracle11g客户端client的下载与安装
    sqlserver2008R2 评估期已过
    SQL2008 提示评估期已过的解决方法
    Windows下Oracle定时备份(全量备份)
    某客的《微信小程序》从基础到实战视频教程
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6879722.html
Copyright © 2011-2022 走看看