• 设计模式(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,安全代理,控制真实对象的访问权限,不让外部看到真实的网络情况。上边的例子就是一个比较好的实例。

    作者:张锋
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
    更多精彩文章可以观注
    微信公众号 soft张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    Win10怎么默认用Windows照片查看程序打开图片
    Class类文件结构——访问标志
    栈的压入弹出序列
    Java中length,length()以及size()的区别
    包含min函数的栈
    extends和implements的区别
    顺时针打印矩阵
    二叉树的镜像
    Class类文件结构解读——常量池
    进制、字(word)、字节(byte)、位(bit)的关系
  • 原文地址:https://www.cnblogs.com/skyme/p/2017926.html
Copyright © 2020-2023  润新知