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

    代理模式(Proxy),其含义是为其他对象提供一种代理以控制对这个对象的访问。对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。当客户向Proxy对象第一次提出请求时,proxy实例化真实的对象,并且将请求传给它,以后所有的客户请求都经由proxy传给封装了的真实对象。

    其适用性:

    远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表,

    虚代理(Virtual Proxy)根据需要创建开销很大的对象,

    保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候,

    智能代理(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作,它的典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它,当第一次引用一个持久对象时,将它装入内存,在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。

    下面是结构图:

                    

    由上面可以看出,其实proxy模式的结构图和装饰模式的结构很像,若要让Decorator直接维护一个指向ConcreteComponent的指针,其就实现了proxy模式。

    很多情况如果因为不想让或不能让客户代码可以直接调用业务实体的时候,需要使用代理模式,这个就相当于我们在这之间加了一个中间层,间接的访问业务类。

      下面是代理模式的简单实现:

    Subject.java

      package org.designpattern.structural.proxy;
    public abstract class Subject {
         public abstract void request();
    }

      ConcreteSubject.java

    package org.designpattern.structural.proxy;
    public class ConcreteSubject extends Subject{

        @Override
        public void request() {
             System.out.println("ConcreteSubject request!");
         }

    } 

      Proxy.java

    package org.designpattern.structural.proxy;
    public class Proxy {
        private Subject subject;    
        public Proxy(Subject subject){
            this.subject = subject;
        }
        public void request(){
            System.out.println("Proxy request:");
            subject.request();
        }

    } 

      上面仅仅是简单的实现,代理模式的使用有很多种,代理模式在分布式环境中常被使用到,在此注意的是远程代理只是地址空间的远程,可以是不同的进程之间。代理模式和装饰模式,适配器模式很相似,但只要记住代理模式是一个中间层的替身概念,就好理解了。

  • 相关阅读:
    iOS提交后申请加急审核
    EF5.0修改实体的时候,出现“对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性这个错误
    验证码生成-->漂亮啊
    用js将毫秒时间转成正常时间
    Ajax异步请求-简单模版
    unity3d自己写角色移动脚本
    unity3d实现序列帧动画
    unity3d切换场景时,背景音乐保持播放
    C#给文件重命名
    NGUI如何创建自己的精灵图集
  • 原文地址:https://www.cnblogs.com/kingcucumber/p/3223950.html
Copyright © 2011-2022 走看看