一:代理模式简介

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

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

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

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

二:实践

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

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) = ; };
#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() % ;
bool succeed = a == ;//如果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 = ; i < ; i++)
{
//买房人向中介查询能否买到指定条件的房子
bool succeed = buyPer->Buy("90万,90平,石家庄裕华区");
cout << "=============================次数:"<<i<<endl;
if (succeed)//如果买房成功了,就不买了
break;
} while (true)
{
char a;
cin >> a;
}
}

输出结果:

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

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

设计模式--代理模式(C++版)的更多相关文章

  1. 9. 星际争霸之php设计模式--代理模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. C++设计模式——代理模式

    前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...

  3. PHP设计模式-代理模式

    概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...

  4. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  5. 浅谈Python设计模式 - 代理模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...

  6. Java 之 设计模式——代理模式

    设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...

  7. 用实例理解设计模式——代理模式(Python版)

    代理模式:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式分为: 静态代理 动态代 ...

  8. [Head First设计模式]抢票中的设计模式——代理模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  9. JAVA 设计模式 代理模式

    用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构

随机推荐

  1. 分享一个低配VPS下运行的mysql配置文件

    在各种内存CPU核心只有1/2核,内存只有512M/1G的vps下,内存.CPU.硬盘都不是太充裕.因此主要思路是,禁止吃内存大户innodb引擎,默认使用MyISAM.禁止吃硬盘大户log-bin, ...

  2. 机器学习-scikit learn学习笔记

    scikit-learn官网:http://scikit-learn.org/stable/ 通常情况下,一个学习问题会包含一组学习样本数据,计算机通过对样本数据的学习,尝试对未知数据进行预测. 学习 ...

  3. 【算法功底】LeetCode 292 Nim Game

    You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...

  4. java基础之类与对象3

    前面我的两篇文章主要介绍了将怎么将事物抽象为对象,以及对象的实例化(就是new一个对象).这篇文章里面我就讲下匿名对象... 还是就举之前的例子把,Car c = new Car();看到这个我们就知 ...

  5. Android -- Annotation(注解)原理详解及常见框架应用

    1,我们在上一篇讲到了EventBus源码及3.0版本的简单使用,知道了我们3.0版本是使用注解方式标记事件响应方法的,这里我们就有一个疑问了,为什么在一个方法加上类似于"@Subscrib ...

  6. 将linux的HOME目录下的文件夹名字改回英文

    为了使用起来方便,装了Ubuntu中文版,自然在home文件里用户目录的“桌面”.“图片”.“视频”.“音乐”……都是中文的.很多时候都喜欢在桌面上放一些要操作的文件,linux里命令行操作又多,难免 ...

  7. [USACO11NOV]牛的障碍Cow Steeplechase

    洛谷传送门 题目描述: 给出N平行于坐标轴的线段,要你选出尽量多的线段使得这些线段两两没有交点(顶点也算),横的与横的,竖的与竖的线段之间保证没有交点,输出最多能选出多少条线段. 因为横的与横的,竖的 ...

  8. 区分词法作用域(js)与动态作用域(精!)

    在js学习中,词法作用域是必须要掌握的! 在这里,我将总结一下<你不知道的JS>一书中词法作用域的重点并分享给大家! 首先带来一段代码示例: function foo(){ console ...

  9. TagHelper的一些个人学习体会(发现了微软官方文档的一个错误)

    最近一直在学习.net core 上周六开始学习Taghelper的自定义,准备周日写个博客和大家分享一下学习体会,无奈周日去考科四了,回来之后就感冒了,现在还没好.可是我发现了微软官方文档的一个错误 ...

  10. Composer 安装(一)

    一.简介 Composer 是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. ...