设计模式--代理模式(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) = ; };
#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++版)的更多相关文章
- 9. 星际争霸之php设计模式--代理模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——代理模式
前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...
- PHP设计模式-代理模式
概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- 浅谈Python设计模式 - 代理模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...
- Java 之 设计模式——代理模式
设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...
- 用实例理解设计模式——代理模式(Python版)
代理模式:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式分为: 静态代理 动态代 ...
- [Head First设计模式]抢票中的设计模式——代理模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 代理模式
用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构
随机推荐
- 【转】air调用windows自带的虚拟键盘
原文:http://bbs.9ria.com/blog-73243-19560.html 最近在做一个东西,需要用到虚拟键盘.刚开始准备用as3开发一套,结果突然想起来windows有个自带的虚拟键盘 ...
- 【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)
最近小菜鸟西瓜莹看到了一道面试题: 给定二叉树,按层打印.例如1的子节点是2.3, 2的子节点是3.4, 5的子节点是6,7. 需要建立如图二叉树: 但是西瓜莹找到的相关代码都是用js构建最优二叉树, ...
- android正则表达式隐藏邮箱地址中间字符
// String emailStr = email.substring(0, email.lastIndexOf("@"));// if (emailStr.length() & ...
- Redux学习笔记:Redux简易开发步骤
该文章不介绍Redux基础,也不解释各种乱乱的概念,网上一搜一大堆.只讲使用Redux开发一个功能的步骤,希望可以类我的小白们,拜托它众多概念的毒害,大牛请绕道! 本文实例源代码参考:React-Re ...
- 如何通过Mysql的二进制日志恢复数据库数据
经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响.所以本文我们将和大家一起分享学习下如何通过Mysql的二机制日志(binlo ...
- [USACO11NOV]牛的障碍Cow Steeplechase
洛谷传送门 题目描述: 给出N平行于坐标轴的线段,要你选出尽量多的线段使得这些线段两两没有交点(顶点也算),横的与横的,竖的与竖的线段之间保证没有交点,输出最多能选出多少条线段. 因为横的与横的,竖的 ...
- Mac下安装BeautifulSoup
1.输入命令su,输入root密码,进入root用户 2.执行命令安装pip: sudo easy_install pip 详细pip介绍:http://blog.csdn.net/olanlanxi ...
- Java线程详解----借鉴
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- HR最喜欢问的问题_"你的职业规划是什么?"
很多面试官都会问,“你的职业规划是什么?”这个问题往往会难倒很多求职者.今天我跟大家分享,求职者怎样回答,才能更给自己加分 1.对目前自己要从事的这个岗位有清晰的认识,比如这个主要的工作是做什么的,大 ...
- 【转】JDBC学习笔记(7)——事务的隔离级别&批量处理
转自:http://www.cnblogs.com/ysw-go/ 数据库事务的隔离级别 对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发 ...