设计模式--代理模式(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) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构
随机推荐
- MongoDB基础教程系列--第五篇 MongoDB 映射与限制记录
上一篇提到的 find() 的方法,细心的伙伴会发现查询的结果都是显示了集合中全部的字段,实际应用中,显然是不够用的.那么有没有办法指定特定的字段显示出文档呢?答案是肯定的,MongoDB 中用映射实 ...
- Android 学习笔记之 Actionbar作为回到上一级
首先,给Actionbar添加返回图标: 代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCrea ...
- 【Direct2D开发】 通过操作像素实现纹理混合
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 我们都知道Direct2D可以加载并显示图片,但是不知道你有没有想过,这个2D的图形引擎可以进行纹理混合吗?如果 ...
- Centos7 tmux1.6 安装
环境:Centos 7.0 安装tmux之前需要先安装一些支持的组件: yum install libevent-devel ncurses-devel 接下来就是下载源码包进行安装了,这里要说明一点 ...
- Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- 如何快速将本地项目托管到到github上?
1,打开你的本地项目文件夹,比如 test-demo: 2,打开github(没有github的要自己注册下), 点击new repository 3,填写项目信息,创建项目 4,复制新建的项目url ...
- Java 工具类—日期获得,随机数,系统命令,数据类型转换
package tems; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; ...
- 用Web抓包分析工具Livepool 实现本地替换开发
这是官方的介绍: LivePool 是一个基于 NodeJS,类似 Fiddler 支持抓包和本地替换的 Web 开发调试工具,是 Tencent AlloyTeam 在开发实践过程总结出的一套的便捷 ...
- jsp实现仿QQ空间新建多个相册名称,向相册中添加照片
工具:Eclipse,Oracle,smartupload.jar:语言:jsp,Java:数据存储:Oracle. 实现功能介绍: 主要是新建相册,可以建多个相册,在相册中添加多张照片,删除照片,删 ...
- angular 实现时间段选择组件
前段时间公司有个后台项目需要使用一个选择时间段的组件,看了一下就自己写了一下,用angular写这种插件还是很简单的. 先看看最终是什么样子的: 功能是用户可以选择任意时间段,鼠标可以拖动任意的一周的 ...