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. 《设计模式:可复用面向对象软件的基础》
  • 相关阅读:
    iOS中Zbar二维码扫描的使用
    SOJ 1135. 飞跃原野
    SOJ 1048.Inverso
    SOJ 1219. 新红黑树
    SOJ 1171. The Game of Efil
    SOJ 1180. Pasting Strings
    1215. 脱离地牢
    1317. Sudoku
    SOJ 1119. Factstone Benchmark
    soj 1099. Packing Passengers
  • 原文地址:https://www.cnblogs.com/Spground/p/9567893.html
Copyright © 2011-2022 走看看