一:代理模式简介

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

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

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

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

二:实践

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

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. jQuery控制input不可编辑

    1.开启disabled,是input不可以编辑 $("#id").attr("disabled","disabled"); 2.关闭dis ...

  2. Ubuntu下搜狗输入法突然无法输入中文

    百度了很久的,后面看到这个帖子,找到解决办法.引用:http://blog.csdn.net/kiss_the_sky/article/details/62238529 删除配置文件,重启搜狗 ubu ...

  3. 青客宝redis内部分享ppt

    Redis:最好的缓存数据库 说Redis是缓存服务,估计有些人会不开心,因为Redis也可以把数据库持久化,但是在大多数情况Redis的竞争力是提供缓存服务.说到缓存服务必然会想到Memcached ...

  4. 老李分享:jvm结构简介 1

    老李分享:jvm结构简介     poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...

  5. (转)Java并发编程:并发容器之ConcurrentHashMap

    下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为 ...

  6. 数据库习题(oracle)

    学生表 Student 字段值分别是 Sid ,Sname ,Sage ,Ssex 教师表 Teacher 字段值分别是 Tid ,Tname 课程表 Course 字段值分别是Cid ,Cname ...

  7. quartus ii有符号数的问题(待完善)

    1.有符号数是以补码的形式存储的,在modelsim仿真时,补码自动转换为有符号的十进制数. 2.关于截位的问题: 当只取寄存器中的其中m位时,这时候取得的数是按照无符号位来处理的? 3.reg型数据 ...

  8. ECP系统J2EE架构开发平台

    一 体系结构 ECP平台是一个基于J2EE架构设计的大型分布式企业协同管理平台,通过采用成熟的J2EE的多层企业架构体系,充分保证了系统的健壮性.开放性和扩展性.可选择部署于多种系统环境,满足不同类型 ...

  9. JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画

    bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){alert( ...

  10. python_Tornado_web_框架_分页

    如何实现web_框架_分页? -- 思考什么是xss跨站攻击? --别人把js代码提交到后台,然后从后台返回数据的时候,别人上传的js变成html中的代码, 就会插入别人的代码,带来极大的信息泄露的风 ...