zoukankan      html  css  js  c++  java
  • 设计模式代理模式(C++版)

    一:代理模式简介

        专业版描述:为其他对象提供一种代理以控制对这个对象的访问。

        在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

        戏剧性描述:房产市场不稳定,房价涨了还是涨。隔壁老王要买房,忍痛找到房产中介,中介把介绍给老王,老王买到中意房。

        这个剧情中老王是主角,演绎了一个买房的故事。房产中介是老王的代理,房子是老王的需求对象,由于中介有房产资源,老王又无法直接找到房源,只能找到中介去买房。

    二:实践

        老王的故事在程序中得以实现。

       

        1.协议定义:买房协议(BuyRoomDelegate)。只有拥有买房协议才能成为房产中介。
        2.代理者:房产中介(RoomDelegate),他继承买房协议。

        3.需要代理者:买房人(BuyRoomPerson),买房需要找代理。

       
        编码如下:

       买房协议(BuyRoomDelegate)

    #pragma once
    #include <functional>
    
    //函数定义:完成代理任务后给请求者反馈
    typedef std::function<void(bool succeed, std::string msg)> RoomHandleCallback;
    
    
    #pragma region BuyRoomDelegate
    
    //买房协议
    class BuyRoomDelegate
    {
    public:
        BuyRoomDelegate() {}
        ~BuyRoomDelegate() {}
    
    public:
        //买房
        virtual bool TryBuy(std::string condition, RoomHandleCallback callback) = 0;
    
    };
    #pragma endregion

        房产中介(RoomDelegate):

    #pragma region RoomDelegate
    
     //房产中介
     class RoomDelegate:public BuyRoomDelegate//, public RoomSellerDelegate
     {
     public:
         RoomDelegate() {}
         ~RoomDelegate() {}
     public:
         //实现父类接口
         //买房
         bool TryBuy(std::string condition, RoomHandleCallback callback);
        
         ////卖房
         // void Selling();
     private:
    
     };
    
    #pragma endregion
    
    
    //RoomDelegate.cpp
    #include "stdafx.h"
    #include "RoomDelegate.h"
    
    bool RoomDelegate::TryBuy(std::string condition, RoomHandleCallback callback)
    {
        cout << "中介找房:" << condition << endl;
        int a = rand() % 2;
        bool succeed = a == 0;//如果a==0,买房成功
        string msg = "";
        if (succeed)//成功
        {
            msg = "中介:恭喜啊";
            cout << "中介:终于卖出了一套房" << endl;
        }
        else
        {
            msg = "中介:对不住呀,这条件不好找呀!";
            cout << "中介:这条件太难找了。。。" << endl;
        }
        if (callback != nullptr)
        {
            callback(succeed, msg);
        }
        return succeed;
    }

        买房人(BuyRoomPerson):

    #pragma once
    
    class BuyRoomDelegate;
    //买房人
    class BuyRoomPerson
    {
    public:
        BuyRoomPerson();
        ~BuyRoomPerson();
    
        //买房
        bool Buy(std::string condition);
    public:
        //设置买房代理
        void setBuyRoomDelegate(BuyRoomDelegate* buyRoomDelegate) { m_buyRoomDelegate = buyRoomDelegate; }
    
    private:
        //买房代理
        BuyRoomDelegate* m_buyRoomDelegate;
    };
    
    //BuyRoomPerson.cpp
    #include "stdafx.h"
    
    BuyRoomPerson::BuyRoomPerson()
    {
        m_buyRoomDelegate = nullptr;
    }
    
    BuyRoomPerson::~BuyRoomPerson()
    {
    }
    
    bool BuyRoomPerson::Buy(std::string condition)
    {
        if (m_buyRoomDelegate != nullptr)
        {
            //string condition = "90万,90平,石家庄裕华区";
            //Lambda 表达式
            bool succeed = m_buyRoomDelegate->TryBuy(condition, [condition, this/*向表达式传参,临时参数、成员参数*/](bool succeed, std::string msg/*参数*/)->void/*返回值类型*/{
                if (succeed)
                {
                    cout<< "买房成功" << condition <<endl;
                }
                else
                {
                    cout << "没有谈妥,买房失败"<<condition << endl;
                }
            });
            return succeed;
        }
        return false;
    }

        测试代码:

    int main()
    {
        //房产中介
        RoomDelegate* roomDel = new RoomDelegate();
    
        //买房人
        BuyRoomPerson* buyPer = new BuyRoomPerson();
        //买房人找个中介帮忙买房
        buyPer->setBuyRoomDelegate(roomDel);
    
        for (size_t i = 0; i < 10; i++)
        {
            //买房人向中介查询能否买到指定条件的房子
            bool succeed = buyPer->Buy("90万,90平,石家庄裕华区");
            cout << "=============================次数:"<<i<<endl;
            if (succeed)//如果买房成功了,就不买了
                break;
        }
    
        while (true)
        {
            char a;
            cin >> a;
        }
    }

         输出结果:

    中介找房:90万,90平,石家庄裕华区
    中介:这条件太难找了。。。
    没有谈妥,买房失败90万,90平,石家庄裕华区
    =============================次数:0
    中介找房:90万,90平,石家庄裕华区
    中介:这条件太难找了。。。
    没有谈妥,买房失败90万,90平,石家庄裕华区
    =============================次数:1
    中介找房:90万,90平,石家庄裕华区
    中介:终于卖出了一套房
    买房成功90万,90平,石家庄裕华区
    =============================次数:2

        恭喜隔壁老王买到房了!!欢迎各位到老王家围观,哈哈哈。

  • 相关阅读:
    数据挖掘、数据分析的书籍推荐
    跳槽时间如何选择
    求职网站总结
    Eclipse中Applet程序运行时Applet小程序大小的设置
    统计学习导论:基于R应用——第五章习题
    统计学习导论:基于R应用——第四章习题
    统计学习导论:基于R应用——第三章习题
    Windows环境下安装IPython NoteBook
    centos7上mysql无法启动也没有日志
    CentOS 6.4下Squid代理服务器的安装与配置
  • 原文地址:https://www.cnblogs.com/mengdongsky/p/6876668.html
Copyright © 2011-2022 走看看