设计模式(5)-己所不欲,施之于人(代理模式)
时间:2022-05-04
本文章向大家介绍设计模式(5)-己所不欲,施之于人(代理模式),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
什么是代理?在我们的日常生活中的例子非常多。
比如上网有的时候使用代理服务器,通过代理上网,这就是代理的一个非常常见的例子。
从这里边可以看到3个对象:真实网路对象,代理对象还有客户端对象。
真实对象和代理对象还都有访问网络的方法所以抽象出网络对象。
对应的类图关系如下:
如图:
真实的网络被隐藏起来,我们访问的是代理的网络对象,同时我们可以在访问代理对象的同时动态的加上比如验证用户,清除用户信息的方法。
生成的文件如下:
client.h
class Client
{
public:
Client();
virtual ~Client();
};
client.cpp
#include "Client.h"
#include "Network.h"
#include "ProxyNetwork.h"
Client::Client(){
}
Client::~Client(){
}
int main(){
ProxyNetwork* proxyNetwork = new ProxyNetwork();
proxyNetwork->browse();
return 0;
}
Network.h
#include <iostream>
using namespace std;
class Network
{
public:
Network();
virtual ~Network();
virtual void browse() = 0;
};
Network.cpp
#include "Network.h"
Network::Network(){
}
Network::~Network(){
}
ProxyNetwork.h
#include "RealNetwork.h"
#include "Network.h"
class ProxyNetwork : public Network
{
public:
ProxyNetwork();
virtual ~ProxyNetwork();
RealNetwork* realNetwork;
virtual void browse();
private:
void checkUser();
void clearUserinfo();
};
ProxyNetwork.cpp
#include "ProxyNetwork.h"
ProxyNetwork::ProxyNetwork(){
}
ProxyNetwork::~ProxyNetwork(){
}
void ProxyNetwork::browse(){
ProxyNetwork::checkUser();
realNetwork = new RealNetwork();
realNetwork->browse();
ProxyNetwork::clearUserinfo();
}
void ProxyNetwork::checkUser(){
cout<<"调用真实对象之前检验用户名"<<endl;
}
void ProxyNetwork::clearUserinfo(){
cout<<"调用真实对象之后清除用户信息"<<endl;
}
RealNetwork.h
#include "Network.h"
class RealNetwork : public Network
{
public:
RealNetwork();
virtual ~RealNetwork();
virtual void browse();
};
RealNetwork.cpp
#include "RealNetwork.h"
RealNetwork::RealNetwork(){
}
RealNetwork::~RealNetwork(){
}
void RealNetwork::browse(){
cout<<"访问真实网路..."<<endl;
}
运行client.cpp中的main,我们得到如下:
代理模式:为其它对象提供一种代理以控制对这个对象的访问。
代理模式的几种应用场景:
1,远程代理,为一个对象在不同的空间提供局部代表,隐藏真实对象,webservice的调用就是一个最好的例子。
2,虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。浏览网页时,我们访问缓存中的对象就是其中一个例子。
3,安全代理,控制真实对象的访问权限,不让外部看到真实的网络情况。上边的例子就是一个比较好的实例。
- Java多线程详解6【面试+工作】
- MySQL备份恢复第二篇(r5笔记第6天)
- SpringMVC 中配置 Swagger 插件.
- MySQL和Oracle对比学习之事务(r5笔记第4天)
- 【面试宝典】Java如何打印数组
- MySQL数据导入导出牛刀小试(r5笔记第3天)
- SpringMVC 异常处理.
- 一条简单的sql在11g和12c中的不同(r5笔记第2天)
- 浅析 SpringMVC 原理和配置.
- 使用impdp不当导致的数据丢失问题(r5笔记第1天)
- MySQL数据库 Event 定时执行任务.
- Tomcat 日志分割.
- crontab导致的频繁发送邮件的问题(r5笔记第20天)
- 再学习之Spring(依赖注入).
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用java计算数组方差和标准差
- jzy3D从入门到弃坑_2 使用jzy3D0.9画2D散点图
- jzy3D从入门到弃坑_3 使用jzy3D0.9画2D散点图--多条线条
- maven安装和应用
- 论文研读-多目标自适应memetic算法
- 一起来学matlab-matlab学习笔记13函数 13_1 函数返回值
- 一起来学matlab-matlab学习笔记13函数 13_2 匿名函数
- 一起来学matlab-matlab学习笔记13函数 13_3 创建函数句柄
- matlab 单元数组和元胞数组
- matlab串联结构体,按属性创建含有元胞数组的结构体
- 一起来学matlab-matlab学习笔记6 性能剖析
- 一起来学matlab-matlab学习笔记5 低级文件输入输出函数
- 一起来学matlab-matlab学习笔记4 数据导入和导出_3 导入和导出电子数据表
- 数据导入和导出_1 MAT文件的保存和读取
- 论文研读-基于决策变量分析的大规模多目标进化算法