設計模式--代理模式(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

 

    恭喜隔壁老王買到房了!!歡迎各位到老王家圍觀,哈哈哈。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM