zoukankan      html  css  js  c++  java
  • 设计模式~代理模式

    代理模式是对象的结构模式。

    代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

    代理模式的英文叫做Proxy或 Surrogate,中文都可翻译为 代理。

    所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。

    在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    代理的种类:

    如果按照使用目的划分,

    • 远程代理(Remote): 为一个位于不同的地址空间的对象提供一个局域代表对象。
    • 虚拟代理(Virtual): 根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
    • Copy-on-Write 代理: 虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
    • 保护代理(Protect or Access): 控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
    • Cache代理: 为某个目标操作的结构提供临时的存储空间,以便多个客户端可以共享这些结果。
    • 防火墙代理(Firewall): 包含目标,不让恶意用户接近。
    • 同步化代理(Synchronization): 使几个用户能够同时使用一个对象而没有冲突。
    • 智能引用代理(Smart Reference): 当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

    代理模式的结构

     代理模式涉及的角色:

    • 抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来,在任何可以使用真实主题的地方都可以使用代理主题。
    • 代理主题角色(Proxy): 代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象:代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题。
    • 真实主题角色: 定义了代理角色所代表的真实对象。

    示意性源码:

    抽象主题角色

    public abstract class Subject {
    
        /**
         * 声明一个抽象的请求方法
         */
        abstract public void request();
    }

    真实主题角色

    public class RealSubject extends Subject {
    
        /**
         * 构造函数
         */
        public RealSubject(){
        }
        @Override
        public void request() {
            // TODO Auto-generated method stub
            System.out.println("From real subject");
        }
    }

    代理主题角色

    public class ProxySubject extends Subject {
    
        private RealSubject realSubject;
        
        public ProxySubject(){}
        
        @Override
        public void request() {
            preRequest();
            if(realSubject == null){
                realSubject = new RealSubject();
            }
            realSubject.request();
            postRequest();
        }
        /**
         * 请求前的操作
         */
        private void preRequest(){
            // something you want to do before requesting
        }
        /**
         * 请求后的操作
         */
        private void postRequest(){
            // something you want to do after requesting
        }
    }

    客户端调用

    public class Client {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Subject subject = new ProxySubject();
            subject.request();
        }
    }

    代理模式的优缺点

    根据代理种类的不同,代理模式有不同的特点。

    远程代理

    优点是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。

    由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。

    虚拟代理

    优点是代理对象可以在必要的时候才被代理的对象加载。代理可以对加载过程加以必要的优化。当一个模块的加载十分耗费资源的时候,虚拟代理的优点就非常明显。

    例如:加载图片时,会在加载的过程显示正在加载中,而加载完成后,则替换成目标图片。

    保护代理

    优点是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理对象。

    智能引用代理

    在访问一个对象时,可以执行一些内务处理操作,比如计数操作等。

  • 相关阅读:
    【转】Android版本升级同时Sqlite数据库的升级及之前数据的保留
    MC 在1分钟图拿出5分钟,15分钟,30分钟,1小时的K线
    MC 自己平均
    MT4 做指标模版
    MQL5 获取最后一单 利润
    MT5基础知识
    DDE复盘流程
    安装lnmp(linux nginx mysql php)
    centos 7 切换运行模式
    安装 flash player
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/13532941.html
Copyright © 2011-2022 走看看