博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代理模式
阅读量:7074 次
发布时间:2019-06-28

本文共 1548 字,大约阅读时间需要 5 分钟。

代理模式

  代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

  在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

 

代理模式一般涉及到的角色

  抽象角色:声明真实对象和代理对象的共同接口。

  代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真实对象。

  同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

  真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

 

用实例来说明

  首先是抽象角色类,可以定义一个接口或者抽象类: 

/** * 真实对象和代理对象的共同接口 *  */public abstract class Subject{    public abstract void request();}

  之后是真实角色的类,实现接口,并完成实际工作:

/** * 真实角色 */public class RealSubject extends Subject{    @Override    public void request()    {        System.out.println("From Real Subject!");    }}

  然后定义代理角色,内部包含对真实角色对象的引用,并且封装功能:

 

/** * 代理角色 *  */public class ProxySubject extends Subject{    //代理角色对象内部含有对真实对象的引用    private RealSubject realSubject;    @Override    public void request()    {        //在真实角色操作之前所附加的操作        preRequest();        if(null == realSubject)        {            realSubject = new RealSubject();        }                //真实角色所完成的事情        realSubject.request();        //在真实角色操作之后所附加的操作        postRequest();    }        private void preRequest()    {        System.out.println("Pre Request.");    }    private void postRequest()    {        System.out.println("Post Request");    }}

  在客户端进行调用时:

/** * 客户类 *   */public class Client{    public static void main(String[] args)    {        Subject subject = new ProxySubject();        subject.request();            }    }

  

问题

  如果要按照上述的方式(静态代理)使用代理模式,那么真实角色必须是实现已经存在的,并将其作为代理对象的内部属性。

  但是实际使用时,一个真实角色必须对应一个代理角色,但如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。

转载地址:http://opkml.baihongyu.com/

你可能感兴趣的文章
谈谈Ms Chart和TeeChart的优缺点
查看>>
Android FM模块学习之四源码解析(一)
查看>>
人生最重要的三种能力,不是读书能学来的
查看>>
JDK中文方框乱码问题
查看>>
关于技术
查看>>
adb学习2
查看>>
面试之STAR法则详解
查看>>
inno安装
查看>>
禁用缓存的设置
查看>>
Idea14解决JSP/JS文件需要重启问题解决
查看>>
对IoC DI的理解
查看>>
tactic remove project
查看>>
实现汉字转拼音
查看>>
太吃鸡了
查看>>
Smart2.0开发指南——开发工具
查看>>
oracle——06表查询中需要注意的一些问题
查看>>
大白话讲Zookeeper能做什么?(一):命名服务与配置管理
查看>>
java httpclient使用socks5代理(二)使用socks5代理服务
查看>>
java实现多线程的三种方式
查看>>
汇编 输入输出字符串(最简单版)
查看>>