zoukankan      html  css  js  c++  java
  • 设计模式(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张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    [转自老马的文章]用MODI OCR 21种语言
    [转老马的文章]MODI中的OCR模块
    贴片晶振的脚位方向如何区分
    晶振简介及如何使用示波器测试晶振
    Lintcode 150.买卖股票的最佳时机 II
    Lintcode 82.落单的数
    Lintcode 97.二叉树的最大深度
    Lintcode 9.Fizz Buzz 问题
    LeetCode之461. Hamming Distance
    NYOJ之题目325 zb的生日
  • 原文地址:https://www.cnblogs.com/skyme/p/2017926.html
Copyright © 2011-2022 走看看