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

    模式简介

    代理模式是设计模式中的一种结构型模式(Structure Pattern),主要应用于:提供一个代理对象(Proxy)控制对一个对象(被代理对象)的访问。

    UML图

    类图

    这里写图片描述

    运行时的对象图如下:

    这里写图片描述

    组成部分

    • Proxy
      • 持有一个Subject实例的引用,以便在Client访问Subject实例的时候,将请求转发给Subject实例;
      • 对客户端提供和Subject一样的接口(实现Subject接口),这样就Proxy实例就可以替换Subject实例;
      • 控制对RealSubject实例的访问,负责如何创建以及销毁它;
      • 按照设计意图又可以分为几类Proxy
        • remote proxy : 将客户对RealSubject的请求和参数编码,然后将编码后的请求和参数转发到位于不同地址空间的RealSubject实例;
        • virtual proxy:保存关于RealSubject额外的调用信息,延迟对RealSubject的访问(通常是由于创建RealSubject的操作开销很大,需要延迟创建);
        • protection proxy:对RealSubject的访问者进行权限检查,以保护RealSubject(常见的就是拦截器);
    • Subject
      • 为Proxy和RealSubject定义共同的接口,以便于在RealProxy能适用的地方,Proxy都能将其替换。
    • RealSubject
      • 被代理对象,实际的操作的执行者。

    例子

    
    public interface ISubject {
        void request();
    }
    
    public abstract class AbstractProxy implements ISubject {
    
    }
    
    public class Proxy extends AbstractProxy {
    
        ISubject realSubject = new RealSubject();
    
        @Override
        public void request() {
            // TODO Auto-generated method stub
            System.out.println("Proxy : [before access to realSubject]");
            realSubject.request();
            System.out.println("Proxy: [after access to realSubject]");
        }
    
    }
    
    public class RealSubject implements ISubject {
    
        @Override
        public void request() {
            // TODO Auto-generated method stub
            System.out.println("RealSubject: [RealSubject request()]");
        }
    
    }
    

    客户端代码:

    public class ProxyDemo {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ISubject subject = new Proxy();//client依赖proxy,没有直接和RealSubject产生依赖
            subject.request();
        }
    }

    输出

    Proxy : [before access to realSubject]
    RealSubject: [RealSubject request()]
    Proxy: [after access to realSubject]

    应用

    • Spring AOP
    • Java CORBA和RMI 的 Stub 和 Skeleton

    References

    1. 《设计模式:可复用面向对象软件的基础》
  • 相关阅读:
    JavaScript
    Eclipse修改类的注释模板
    无法解析指定的连接标识符的解决办法
    MySQL
    IDEA修改SQL语句的关键字大写
    iframe中操作后通过后台返回脚本,让父窗口刷新
    IDEA启动Tomcat控制台打印乱码
    Eclipse如何打开文件的磁盘位置
    深度学习目标检测算法综述(论文和代码)
    关于并发,异步,非阻塞(python)疑惑的一些资料解答
  • 原文地址:https://www.cnblogs.com/Spground/p/9567893.html
Copyright © 2011-2022 走看看