问题分析:

什么是代理模式呢?其实我们在生活中并不少见。对于程序员来说最常接触的莫过于代理上网了,连接大力服务器地址,就可以访问网络。

还有每天吃饭赶进度是常事,叫公司的同事帮忙带饭也是一种代理;如果你辞职老板不给你发工资,那么你还得请个律师帮你打官司,这也是一种代理。总之生活中无处不在。

代理的定义:

为其他对象提供一种代理以控制对这个对象的访问。简单点就是在不直接操作访问对象的的情况下,找一个代理访问该对象,就是自己不想搞,这个其他人帮你搞。

基本UML图:

具体问题UML类图:

抽象主题类Subject.java

package com.hust.staticProxy1;public abstract class Subject {public abstract void visit();//普通业务方法
}

实现抽象主题的真正主题类RealSubject.java

package com.hust.staticProxy1;public class RealSubject extends Subject {public void visit() {System.out.println("Real Subject!");}}

代理类ProxySubject.java

package com.hust.staticProxy1;
//代理类
public class ProxySubject extends Subject {private  RealSubject mRealSubject;//把被代理对象作为成员变量public ProxySubject(RealSubject mRealSubject){this.mRealSubject=mRealSubject;}public void visit() {mRealSubject.visit();//调用被代理对象的逻辑方法}}

Client.java

package com.hust.staticProxy1;public class Client {/*** @param args*/public static void main(String[] args) {//实例化一个被代理对象RealSubject mRealSubject=new RealSubject();//用被代理对象构造一个代理对象ProxySubject mProxySubject=new ProxySubject(mRealSubject);//调用代理对象的相关方法mProxySubject.visit();}}

代理模式的简单实现:
设定一个故事情节,小明上班遇到一个被老板拖欠工资甚至克扣工资的情况,这种情况下小明还是通过法律来解决问题,一旦小明选择走法律途径解决该纠纷,那么不可避免的需要请个律师作为自己的诉讼代理人,我们将诉讼流程抽象在一个接口中。

诉讼接口类

package com.hust.staticProxy2;public interface LawSuit {//提交申请void submit();//进行举证void burden();//开始辩护void defend();//诉讼完成void finish();
}

具体诉讼人,就是被代理对象小明,就是他想做的事

package com.hust.staticProxy2;public class XiaoMing implements LawSuit {//被代理类,实现诉讼接口public void submit() {// 老板欠小明工资,小明只好申请仲裁System.out.println("老板欠小明工资,小明只好申请仲裁");}public void burden() {//小明证据充足,不怕告不赢System.out.println("这是合同书和过去一年的银行卡工资流水");}public void defend() {// 铁证如山,辩护也没什么好说的System.out.println("证据确凿!不需要早说些什么了!");}public void finish() {// 结果也肯定的System.out.println("诉讼成功,判决老板即日起七天内结算工资");}}

代理律师类:就是代理对象,小明让这个代理类完成诉讼流程

package com.hust.staticProxy2;
//律师代理类
public class Lawyer implements LawSuit{private LawSuit mLawSuit;public Lawyer(LawSuit mLawSuit){this.mLawSuit=mLawSuit;}public void submit() {// 调用被代理类的方法mLawSuit.submit();}public void burden() {// 调用被代理类的方法mLawSuit.burden();}public void defend() {// 调用被代理类的方法mLawSuit.defend();}public void finish() {// 调用被代理类的方法mLawSuit.finish();}}

客户端类

package com.hust.staticProxy2;public class ClientTest {/*** @param args*/public static void main(String[] args) {//构造被代理对象小明LawSuit xiaoming=new XiaoMing();//小明委托代理对象律师Lawyer mLawyer=new Lawyer(xiaoming);//代理对象律师帮助小明提出诉讼申请mLawyer.submit();//代理对象律师进行举证mLawyer.burden();//代理对象律师代替小明进行辩护mLawyer.defend();//代理对象律师完成诉讼mLawyer.finish();}}

输出:

老板欠小明工资,小明只好申请仲裁
这是合同书和过去一年的银行卡工资流水
证据确凿!不需要早说些什么了!
诉讼成功,判决老板即日起七天内结算工资

代理模式的意义:
代理模式到底好处在哪里呢??
那先要说一下代理模式中的三种角色了。
   抽象角色:声明真实对象和代理对象的共同接口。
   代理角色代理对象角色内部含有对真实对象的引用, 从而可以操作 真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象,可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

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

  代理模式的一个好处就是对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行系统扩展。也就是说,我要修改真实角色的操作的时候,尽量不要修改他,而是在外部在“包”一层进行附加行为,即代理类。例如:接口A有一个接口方法operator(),真实角色:RealA实现接口A,则必须实现接口方法operator()。客户端Client调用接口A的接方法operator()。现在新需求来了,需要修改RealA中的operator()的操作行为。怎么办呢?如果修改RealA就会影响原有系统的稳定性,还要重新测试。这是就需要代理类实现附加行为操作。创建代理ProxyA实现接口A,并将真实对象RealA注入进来。ProxyA实现接口方法operator(),另外还可以增加附加行为,然后调用真实对象的operator()。从而达到了“对修改关闭,对扩展开放”,保证了系统的稳定性。我们看客户端Client调用仍是接口A的接口方法operator(),只不过实例变为了ProxyA类了而已。也就是说代理模式实现了ocp原则。

什么时候使用代理模式
  当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。例如:如果构建一个对象很耗费时间和计算机资源,代理模式(Proxy)允许我们控制这种情况,直到我们需要使用实际的对象。一个代理(Proxy)通常包含和将要使用的对象同样的方法,一旦开始使用这个对象,这些方法将通过代理(Proxy)传递给实际的对象。 一些可以使用代理模式(Proxy)的情况:
  1,一个对象,比如一幅很大的图像,需要载入的时间很长。    
     2,一个需要很长时间才可以完成的计算结果,并且需要在它计算过程中显示中间结果
  3,一个存在于远程计算机上的对象,需要通过网络载入这个远程对象则需要很长时间,特别是在网络传输高峰期。
  4,一个对象只有有限的访问权限,代理模式(Proxy)可以验证用户的权限

  代理模式(Proxy)也可以被用来区别一个对象实例的请求和实际的访问,例如:在程序初始化过程中可能建立多个对象,但并不都是马上使用,代理模式(Proxy)可以载入需要的真正的对象。这是一个需要载入和显示一幅很大的图像的程序,当程序启动时,就必须确定要显示的图像,但是实际的图像只能在完全载入后才可以显示!这时我们就可以使用代理模式(Proxy)。

Java设计模式-Proxy代理模式相关推荐

  1. Java设计模式之代理模式(Proxy)

    参考http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924 1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的 ...

  2. Java 设计模式_代理模式(2016-08-19)

    概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  3. Java设计模式(三) -- 代理模式

    代理是一种设计模式,即通过代理对象访问目标对象,这样可以在目标对象实现的基础上,增强额外的功能,即扩展目标类的功能. 通常编程中存在一种思想,即不要随意修改别人的代码或者方法,所以代理就可以在不修改目 ...

  4. java设计模式之代理模式详解

    代理模式在Java中十分常见,有如Spring实现AOP而使用动态代理,更有RPC实现中使用的调用端调用的代理服务.代理模型除了是一种设计模式之外,它更是一种思维,所以探讨并深入理解这种模型是非常有必 ...

  5. java设计模式之代理模式多种写法(三)

    背景 代理模式属于结构型模式,代理模式也是我们开发中常用的设计模式之一,本次讲解以下几种代理模式的写法,希望可以帮助大家更快的理解代理模式,包括自己写一个动态代理的方法. 静态代理 package c ...

  6. Java 设计模式之代理模式

    1.静态代理 被代理对象和代理对象都要实现相同的接口或者继承相同的父类. 不需要修改被代理对象就可以实现对功能的扩展,缺点是如果接口发生变化,比如增加新方法,被代理对象和代理对象都需要维护. 1)首先 ...

  7. java设计模式之——代理模式

    1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象 ...

  8. Java设计模式之代理模式

    示例为最经典的西门庆示例 1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理 ...

  9. Java设计模式-之代理模式(动态代理)

    一.简介 1.什么叫代理模式:        简而言之就是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

最新文章

  1. 2021 倒计时,编程日历倒计时,但伟大与经典历久弥新
  2. 【Linux内非root安装】graphviz安装
  3. String 类型的相关转换
  4. 现在已经到了考虑云计算的时候
  5. 12款响应式的 jQuery 旋转木马(传送带)插件
  6. [vue] 说说你对vue的表单修饰符.lazy的理解
  7. 果断收藏!156页PPT全景展现全球区块链发展(附完整版下载手册)
  8. 股票的科创板,新三板,创业板到底哪个能让你赚钱
  9. Java的switch是否支持String作为参数,还支持哪些类型?
  10. 逆向project第003篇:跨越CM4验证机制的鸿沟(上)
  11. 本科毕业论文查重网站分享(维普、知网、万方、大雅等)
  12. 进化算法——组合优化
  13. Matlab 直方图均衡化
  14. Windows 10蓝牙只能发送文件到手机而无法从手机接收文件
  15. Web编程入门暨个人网站计划:Web前端开发入门
  16. 微信小程序,物流助手对接(中通篇)待续
  17. 安利一波gif录制工具
  18. 如何正确选择注塑模具浇口位置?这下真的懂了
  19. 区块链:信仰亦需理性
  20. 地面站定制开发无人机教程分享

热门文章

  1. RDA8955的新版本SDK串口接收数据的问题记录
  2. PKI/CA (5)X.509公钥证书
  3. 现代密码学2.2、2.3--由“一次一密”引出具有完美安全的密码方案共同缺点
  4. 操作系统课设--NACHOS试验环境准备、安装与MAKEFILE分析
  5. buu [HDCTF2019]basic rsa
  6. 10-Platform Interrupt Controller API
  7. 类的实例方法静态方法类方法属性方法属性
  8. (63)0环与3环通信非常规方式 —— 0环InlineHook
  9. android判断模拟器的三种方法
  10. Windbg新手入坑指南