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. 《设计模式:可复用面向对象软件的基础》
  • 相关阅读:
    测试精进之路
    访问Apache服务器自动跳转到https协议
    如何安装Chrome OS系统
    遇到Project Target Framework Not Installed解决方法
    2019开发者调查结果和总结
    「工具神器」推荐一个扒网页的神器
    Linux 使用Unzip提示write error (disk full?). Continue? (y/n/^C)的解决方法
    安卓编译Failed to authenticate Jack server certificate错误问题解决办法
    如何手动给APK文件签名
    如何给个人网站添加免费的SSL
  • 原文地址:https://www.cnblogs.com/Spground/p/9567893.html
Copyright © 2011-2022 走看看