zoukankan      html  css  js  c++  java
  • 浅谈Java设计模式——代理模式(Proxy)

    一、概述

             为其他对象提供一种代理以控制对这个对象的访问。代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表,其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的,同时也在一定程度上面减少了系统的耦合度。

    二、使用场景

    1.远程访问:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

    2.虚拟代理:根据需求创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

    3.安全代理:用来控制真实对象访问时的权限。

    4.智能指引:调用真实的对象时,代理处置另外一些事。

    三、参与者

    1.Proxy 保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,Proxy会引用Subject。 提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。 控制对实体的存取,并可能负责创建和删除它。 其他功能依赖于代理的类型:

    2.RemoteProxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。 

    3.VirtualProxy可以缓存实体的附加信息,以便延迟对它的访问。 

    4.ProtectionProxy检查调用者是否具有实现一个请求所必需的访问权限。

    5.Subject 定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。 

    6.RealSubject 定义Proxy所代表的实体。

    四、类图

    五、代码示例

    1.Subject:

    /**
     * Subject
     * @author zhipeng_Tong
     */
    public interface Subject {
        void active();
    }

    2.RealSubject:

    /**
     * RealSubject
     * @author zhipeng_Tong 
     */
    public class RealSubject implements Subject {
        @Override
        public void active() {
            System.out.println("------------------------");
            System.out.println("被代理类 RealSubject....");
            System.out.println("------------------------");
        }
    }

    3.Proxy:

    /**
     * Rroxy
     * @author zhipeng_Tong 
     */
    public class Proxy implements Subject {
        private Subject subject;
    
        public Proxy() {
            System.out.println("代理类 Proxy 被初始化...");
            this.subject = new RealSubject();
        }
    
        @Override
        public void active() {
            System.out.println("代理开始");
            subject.active();
            System.out.println("代理结束");
        }
    }

    4.测试代码

    public class Client {
        public static void main(String[] args) {
            Proxy proxy = new Proxy();
            proxy.active();
        }
    }

    运行结果:

    代理类 Proxy 被初始化...
    代理开始
    ------------------------
    被代理类 RealSubject....
    ------------------------
    代理结束
  • 相关阅读:
    项目--Asp.net全局变量的设置和读(web.config 和 Gloab)
    项目--后台代码提示
    项目--给项目添加提示声音
    项目--正则表达式
    项目--HTML Canvas 和 jQuery遍历
    项目--用户自定义控件
    Bzoj2120/洛谷P1903 数颜色(莫队)
    Poj2482 Stars in Your Window(扫描线)
    Poj2182 Lost Cows(玄学算法)
    Poj3468 A Simple Problem with Integers (分块)
  • 原文地址:https://www.cnblogs.com/IdealSpring/p/11871173.html
Copyright © 2011-2022 走看看