设计模式----------代理模式

前言:

代理模式:为其他对象提供一种代理以控制对这个对象的访问,有时也可以在此之上进行某些操作或者拓展,这样就实现了业务和核心功能分离。


定义:

为其他对象提供一种代理以控制(隔离,使用接口)对这对象的访问。 ——《设计模式》GoF


代理模式的应用场景:
  • 修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
  • 就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
  • 使用代理模式,可以将功能划分的更加清晰,有助于后期维护

优点:

  • 职责清晰。
  • 高扩展性。
  • 智能化。

缺点:

  • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
  • 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

使用场景:
1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

在这里插入图片描述



代码演示:

# include <iostream>
# include <cstdlib>
# include <string>
using namespace std;

class IFactory
{
    
    
    public:
        IFactory(){
    
    }

        virtual void func() = 0;
};

class My_Phone_Factory:public IFactory{
    
    
    public:
        My_Phone_Factory(){
    
    }

        void func(){
    
    
            string str = "我的手机工厂正在生产...";
            std::cout<<str<<std::endl;
        }

};

class FoxconProxy:public IFactory{
    
    
    public:
        FoxconProxy(IFactory* factory){
    
    
            m_real = factory;
        }

        void func(){
    
    
            m_real->func();
        }
    private:
        IFactory* m_real;
};

int main(void)
{
    
    
    IFactory* proxy = new My_Phone_Factory();
    FoxconProxy* Proxy = new FoxconProxy(proxy);
    Proxy->func();
    system("pause");return 0;
}

这里代理模式的代码,我们使用的目的其实很明确,访问代理类再访问真正要访问的对象。因为代理类可以在真正的类执行之前,进行预处理。
举个例子:
在用户登录时, 真正的登录类和代理登录类都实现了Login接口, 不同的是Proxy类的方法中增加了用户是否合法的判断, 只有合法时才去调用真正登录类的login方法. 用户访问的其实是Proxy的login方法。



代理模式主要分为四类:

远程代理,虚代理,保护代理和智能引用。 其它还有挺多不常用的代理模式

  • 远程代理
    • 负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求;
    • 调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。

  • 虚代理
    • 可以缓存实体的附加信息,以便延迟对它的访问;

    • 直到我们真正需要一个对象的时候才创建它,比如当加载图片时,我们打开不同的相册,才会去显示所选相册的图片。

    • 当对象在创建前和创建中时,由虚拟代理来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。

    • 浏览器就使用了代理 参考文章!


  • 保护代理

    • 添加信息 检查调用者是否具有实现一个请求所必须的访问权限。

  • 智能引用代理

    • 当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等。
注:proxy模式不一定要保持接口的一致性。只要能够实现间接控制,有时候损及一些透明性是可以接受的

猜你喜欢

转载自blog.csdn.net/weixin_43743711/article/details/109170819