设计模式--代理模式(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) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构
随机推荐
- PyQt通过resize改变窗体大小时ListWidget显示异常
前几天开始的pygame音乐播放器Doco,做的差不多了,上午做到了歌词显示和搜索页面.遇到bug,即通过resize改变ui大小时ListWidget显示异常 #目的: 增加一部分窗口用来显示歌词和 ...
- webix .datatable 表格分页
grid表格返回参数大都是 以下这种格式(参数名可能不一样) { data:[{...},{...} ...], count:39 } webix的参数格式为 { data:[{...},{...}, ...
- 老李谈HTTP1.1的长连接 2
HTTP1.1的长连接 但是HTTP1.1开始默认建立的是长连接,即一旦浏览器发起HTTP请求,建立的连接不会请求应答之后立刻断掉. 1. 一个复杂的具备很多HTTP资源的网页会建立多少TCP连接,如 ...
- 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer
老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer poptest是国内唯一一家培养 ...
- 细细探究MySQL Group Replicaiton — 配置维护故障处理全集
本文主要描述 MySQL Group Replication的简易原理.搭建过程以及故障维护管理内容.由于是新技术,未在生产环境使用过,本文均是虚拟机测试,可能存在考虑不周跟思路有误 ...
- C#基础语法(一)
一.基础语法 1.C#区分大小写,所以myVar和MyVar是两个不同的变量. 2.每个C#可执行文件(如控制台应用程序,Windows应用程序和Windows服务)都必须有一个入口点----Main ...
- c#FTP操作类,包含上传,下载,删除,获取FTP文件列表文件夹等Hhelp类
有些时间没发表文章了,之前用到过,这是我总结出来关于ftp相关操作一些方法,网上也有很多,但是没有那么全面,我的这些仅供参考和借鉴,希望能够帮助到大家,代码和相关引用我都复制粘贴出来了,希望大家喜欢 ...
- java 基础知识四 流程控制
java 基础知识四 流程控制 Java流程控制包括顺序控制.条件控制和循环控制 顺序控制就是逐条执行 有if和switch两个分支 循环控制就是 又称为回路控制,根据循环初始条件和终结要求,执行 ...
- activiti 5.13 使用activiti设置用户组任务的 工作流的角色
1.设置activiti 流程引擎的用户,组别,关系/**在部署流程定义和启动流程实例的中间,设置组任务的办理人,向Activiti表中存放组和用户的信息*/ IdentityService iden ...
- 转账示例(四):service层面实现(线程管理Connection,AOP思想,动态代理)(本例采用QueryRunner来执行sql语句,数据源为C3P0)
用了AOP(面向切面编程),实现动态代理,service层面隐藏了开启事务.1.自行创建C3P0Uti,account数据库,导入Jar包 2.Dao层面 接口: package com.learni ...