Proxy代理模式 :

为其他对象提供一种代理以控制对这个对象的访问。代理类作为桥梁是请求方和执行方的中间者,将请求方和真正的执行方分割开来,也是两者之间调用的协调者。例如执行类也就是被代理类,可以在不考虑各种特殊条件下提供所有的执行方法,请求者也可以不考虑特殊条件提出所有的请求。而在调用和被调用时需要考虑的所有条件,在代理类中完成。

1. 考虑请求方的情况:由各代理处理不同的请求

 class Service
{
public:
Service(); virtual void serviceLv0() = ;
virtual void serviceLv1() = ;
virtual void serviceLv2() = ;
}; class OfferService : public Service
//真正的服务提供者
{
public:
OfferService(); void serviceLv0()
{
cout<<"Offer serviceLv0"<<endl;
}
void serviceLv1()
{
cout<<"Offer serviceLv0"<<endl;
}
void serviceLv2()
{
cout<<"Offer serviceLv0"<<endl;
}
}; class ProxyOfferServiceLv0 : public Service
//lv0 的服务提供代理
{
public:
ProxyOfferServiceLv0()
{
m_instance = new OfferService();
} void serviceLv0()
{
m_instance->serviceLv0();
}
void serviceLv1()
{
cout<<"No serviceLv0"<<endl;
}
void serviceLv2()
{
cout<<"No serviceLv0"<<endl;
} OfferService* m_instance;
}; class ProxyOfferServiceLv2 : public Service
//lv2 的服务提供代理
{
public:
ProxyOfferServiceLv2()
{
m_instance = new OfferService();
} void serviceLv0()
{
m_instance->serviceLv0();
}
void serviceLv1()
{
m_instance->serviceLv1();
}
void serviceLv2()
{
m_instance->serviceLv2();
} OfferService* m_instance;
};

2. 考虑执行方的情况

 enum EnumState
{
State_isOK,
State_notOK
}; class Service
{
public:
Service(); virtual void serviceLv0() = ;
virtual void serviceLv1() = ;
virtual void serviceLv2() = ; int getServiceState()
{
return m_state;
} int m_state; // EnumState
}; class OfferService : public Service
//真正的服务提供者
{
public:
OfferService(); void serviceLv0()
{
cout<<"Offer serviceLv0"<<endl;
}
void serviceLv1()
{
cout<<"Offer serviceLv0"<<endl;
}
void serviceLv2()
{
cout<<"Offer serviceLv0"<<endl;
}
}; class ProxyOfferServiceLv0 : public Service
//lv0 的服务提供代理
{
public:
ProxyOfferServiceLv0()
{
m_instance = new OfferService();
} void serviceLv0()
{
if(m_instance->getServiceState() == State_isOK)
//查看执行方的状态
{
m_instance->serviceLv0();
}
else
{
cout<<"serviceLv0 is noOK"<<endl;
}
}
void serviceLv1()
{
cout<<"No serviceLv0"<<endl;
}
void serviceLv2()
{
cout<<"No serviceLv0"<<endl;
} OfferService* m_instance;
}; class ProxyOfferServiceLv2 : public Service
//lv2 的服务提供代理
{
public:
ProxyOfferServiceLv2()
{
m_instance = new OfferService();
} void serviceLv0()
{
if(m_instance->getServiceState() == State_isOK)
//查看执行方的状态
{
m_instance->serviceLv0();
}
else
{
cout<<"serviceLv0 is noOK"<<endl;
}
}
void serviceLv1()
{
if(m_instance->getServiceState() == State_isOK)
//查看执行方的状态
{
m_instance->serviceLv1();
}
else
{
cout<<"serviceLv1 is noOK"<<endl;
}
}
void serviceLv2()
{
if(m_instance->getServiceState() == State_isOK)
//查看执行方的状态
{
m_instance->serviceLv2();
}
else
{
cout<<"serviceLv2 is noOK"<<endl;
}
} OfferService* m_instance;
};

C++模式学习------代理模式的更多相关文章

  1. (@WhiteTaken)设计模式学习——代理模式

    今天学习了一下代理模式,代理模式分为很多种.目前感觉有两种是需要学习一下的. 静态代理模式 动态代理模式 1. 静态代理模式 需要被代理的类,实现一个或者多个接口. 代理类需要实现被代理类的接口,在此 ...

  2. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  3. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  4. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  5. 10.JAVA-接口、工厂模式、代理模式、详解

    1.接口定义 接口属于一个特殊的类,这个类里面只能有抽象方法和全局常量  (该概念在JDK1.8之后被打破,在1.8后接口中还可以定义普通方法和静态方法,在后续章节会详讲) 1.1 接口具有以下几个原 ...

  6. [转载]Java中继承、装饰者模式和代理模式的区别

    [转载]Java中继承.装饰者模式和代理模式的区别 这是我在学Java Web时穿插学习Java设计模式的笔记 我就不转载原文了,直接指路好了: 装饰者模式和继承的区别: https://blog.c ...

  7. axios 两种异步模式,代理模式 和 异步模式

    axios 两种异步模式,代理模式 和 异步模式

  8. 结构型模式(七) 代理模式(Proxy)

    一.动机(Motivate) 在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦.如何在不 ...

  9. swift设计模式学习 - 代理模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 代理模式 代理模式为其他对象提供一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象 ...

随机推荐

  1. Linux 技巧

    Linux Handbook For RedHat Enterprise Linux System System # clean old kernel packages package-cleanup ...

  2. linux设置禁止ping

    linux禁止ping为了服务器的安全, 防止网络攻击(DOS 攻击消耗网络宽带,CPU资源), 需要服务器设置 禁止ping通常有两种方式第一种是通过防火墙 iptables 设置第二种是内核设置 ...

  3. hdu2795 Billboard(线段树单点修改)

    传送门 结点中的l和r表示层数,maxx表示这层最多还剩下多少宽度.根据公告的宽度取找到可以放的那一层 找到后返回层数,并修改maxx #include<bits/stdc++.h> us ...

  4. 经典笔试题:用C写一个函数测试当前机器大小端模式

    “用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...

  5. 第一阶段·Linux运维基础-第1章·Linux基础及入门介绍

    01-课程介绍-学习流程 02-服务器硬件-详解 03-服务器核心硬件-服务器型号-电源-CPU 01-课程介绍-学习流程 1.1. 光看不练,等于白干: 1.2 不看光练,思想怠慢: 1.3 即看又 ...

  6. NO 18---- webpack 4.x 使用遇到的问题以及开发配置

    最近在项目中用webpack的过程中老是出现问题,很是纳闷,按理说一直这样使用没有问题啊,经过我研究后发现,是因为在webpack更新到4.x之后,操作方式与之前相比变化很大.而我们使用npm默认安装 ...

  7. .NetCore下使用EF DbFirst操作MySql

    新建.NetCore的控制台项目 使用Nuget安装Pomelo.entityframeworkcore.mysql 工程右键--->编辑.csproj文件,把以下内容写入到工程文件 <I ...

  8. ats Linux Bridge内联

    Linux可以配置为在桥接模式下运行. 为网桥分配了两个或更多物理接口. 在接口之间共享单个IP地址. 默认情况下,任何到达一个接口的数据包都会立即路由到另一个网桥接口. 需要的Linux包: bri ...

  9. kafka consumer demo

    kafka消费者demo pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmln ...

  10. 互评Beta版本(Hello World!——SkyHunter)

    1 基于NABCD评论作品,及改进建议 SkyHunter这款游戏我很喜欢,小时候总玩飞机类的游戏,这款游戏我上课的时候试玩了,在我电脑上运行是很好玩的,音乐震撼,画面玄幻,富有金属音乐的味道,游戏内 ...