• 代理模式


    代理模式,在UML类结构上很好理解, 不过在实际应用当中可能并不是很清楚代理模式应用在哪些场景里。这里给出《大话设计模式》中对代理模式应用场合的解释:

    第一,远程代理,也就是为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

    第二,虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

    第三,安全代理,用来控制真实对象访问时的权限。

    第四,智能指引,是指当调用真实对象的对象时,代理处理另外一些事。(这里和动态代理类似)

    我们画出动态代理的UML类结构图。

    可以看出代理模式的UML类结构非常简单。

    真实实体和代理共有的接口代码如下:

     1 package day_7_proxy;
     2 
     3 /**
     4  * 真实实体和代理共有的接口
     5  * @author turbo
     6  *
     7  * 2016年9月11日
     8  */
     9 public interface Subject {
    10     
    11     void request();
    12 }

    真实实体和代理类代码,在真实实体中做真正要做的动作,而在代理中并不需要做真正的动作,仅仅是调用真实实体的方法动作即可。

     1 package day_7_proxy;
     2 
     3 /**
     4  * 真实实体
     5  * @author turbo
     6  *
     7  * 2016年9月11日
     8  */
     9 public class RealSubject implements Subject {
    10 
    11     /* (non-Javadoc)
    12      * @see day_7_proxy.Subject#request()
    13      */
    14     @Override
    15     public void request() {
    16         System.out.println("真实的访问");
    17     }
    18 
    19 }
     1 package day_7_proxy;
     2 
     3 /**
     4  * 代理类
     5  * @author turbo
     6  *
     7  * 2016年9月11日
     8  */
     9 public class Proxy implements Subject {
    10     private RealSubject realSubject;
    11     
    12     /* (non-Javadoc)
    13      * @see day_7_proxy.Subject#request()
    14      */
    15     @Override
    16     public void request() {
    17         if (realSubject == null){ 
    18             realSubject = new RealSubject();
    19         }
    20         
    21         realSubject.request();
    22     }
    23 
    24 }

    客户端代码:

     1 package day_7_proxy;
     2 
     3 /**
     4  * @author turbo
     5  *
     6  * 2016年9月11日
     7  */
     8 public class Main {
     9     public static void main(String[] args){
    10         Proxy proxy = new Proxy();
    11         proxy.request();
    12     }
    13 }

    这样我们就简单的实现了一个代理模式。同样也没有详细深入的讲解,在以后会结合更加实际的代码,或者开源框架代码来实际领会代理模式的威力。

    Java中还有一个动态代理,后面我们会说下这个动态代理是个什么东西。

  • 相关阅读:
    leetcode刷题笔记五十八 最后一个单词的长度
    leetcode刷题笔记五十六和五十七 合并区间与插入区间
    linux根据端口号,或进程名获取进程pid
    linux系统简单配置——centos7
    日常知识点记录
    实用代码-获取某一个对象中的信息
    java获取svn中的数据
    idea快捷键整理,以及eclipse快捷键对比,持续更新中
    ajax发送同步请求
    基于 pygame 设计贪吃蛇游戏
  • 原文地址:https://www.cnblogs.com/yulinfeng/p/5861988.html
Copyright © 2020-2023  润新知