1. //代理模式定义:为其它对象提供一种代理以控制对这个对象的訪问
  2. //实例:鉴于书中给出的样例不太好。并且有些疑问,所以直接用保护代理作为实例
  3. //要求,一旦订单被创建,仅仅有订单的创建人才干够改动订单中的数据,其它人则不能改动
  4. //这里,代理模式的作用是做訪问控制,即在訪问对象时。中间加一个中转
  5. public interface OrderApi {
  6. public String getProductName();
  7. public void setProductName(String productName,String user);
  8. public int getOrderNum();
  9. public void setOrderNum(int orderNum,String user);
  10. public String getOrderUser();
  11. public void setOrderUser(String orderUser,String user);
  12. }
  13. public class Order implements OrderApi {
  14. private String productName;
  15. private int orderNum;
  16. private String orderUser;
  17. public Order(String productName,int orderNum,String orderUser) {
  18. this.productName = productName;
  19. this.orderNum = orderNum;
  20. this.orderUser = orderUser;
  21. }
  22. //get,set methods
  23. }
  24. public class OrderProxy implements OrderApi {
  25. private Order order = null;
  26. public OrderProxy(Order realSubject) {
  27. this.order = realSubject();
  28. }
  29. public void setProductName(String productName,String user) {
  30. //控制訪问权限,仅仅有创建订单的人员才干够改动
  31. if(user!=null && user.equals(this.getOrderUser())) {
  32. order.setProductName(productName,user);
  33. }else {
  34. System.out.println("对不起"+user+",您没有改动产品名称的权限");
  35. }
  36. }
  37. //相同。下面是setOrderNum和setOrderUser,及get方法。省略
  38. }
  39. public class Client {
  40. public static void main(String[] args) {
  41. OrderApi order = new OrderProxy(new Order("设计模式",100,"张三"));
  42. order.setOrderNum(123,"李四");
  43. //这个设置是无效的,由于李四没有改动张三订单的权限
  44. }
  45. }
  46. //以上是自己写出的代理,事实上Java对代理模式提供了内建的支持
  47. //在java.lang.reflect包下,提供了一个Proxy的类和一个InvocationHandler的接口
  48. //通常把我们自己写的代理叫做Java的静态代理,由于假设Subject接口发生变化。那么代理类
  49. //和详细的目标实现都要变化。不够灵活
  50. //而把Java中内建的对代理模式叫做Java的动态代理,动态代理跟静态代理相比,明显的变化是:
  51. //动态代理实现的时候。尽管Subject接口上定义了非常多方法,可是动态代理类始终仅仅有一个invoke方法
  52. //这样,当Subject接口发生变化的时候,动态代理的接口就不须要跟着变化了
  53. //看实例
  54. public class DynamicProxy implements InvocationHandler {
  55. private OrderApi order = null;
  56. public Order getProxyInterface(Order order) {
  57. this.order = order;
  58. OrderApi orderApi = (OrderApi)Proxy.newProxyInstance(
  59. order.getClass().getClassLoader(),
  60. order.getClass().getInterfaces(),
  61. this);
  62. return orderApi;
  63. }
  64. public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
  65. if(method.getName().startsWith("set")) {
  66. if(order.getOrderUser()!=null && order.getOrderUser().equals(args[1])) {
  67. return method.invoke(order,args);
  68. }else {
  69. //无权限
  70. }
  71. }else {
  72. return method.invoke(order,args);
  73. }
  74. }
  75. }
  76. public class Client {
  77. public static void main(String[] args) {
  78. Order order = new Order("设计模式",100,"张三");
  79. DynamicProxy dynamicProxy = new DynamicProxy();
  80. OrderApi orderApi = dynamicProxy.getProxyInterface(order);
  81. orderApi.setOrderNum(123,"李四");
  82. //实际使用的是经过加工的set方法
  83. //无权限
  84. }
  85. }
  86. //代理模式的本质:控制对象訪问
  87. //既然本质是控制对象訪问,意思就是在訪问者与原始对象之间加一个代理就可以
  88. //同理,代理模式也能够通过继承原始类来实现,让訪问者操作继承类,继承类来控制原始对象的訪问
  89. //从而实现控制对象訪问的目的
  90. //何时选用代理模式
  91. //1.须要为一个对象在不同的地址空间提供局部(重点)代表的时候,能够使用远程代理
  92. //2.须要依照须要创建开销非常大的对象的时候。能够使用虚代理(即一个不完整的对象)
  93. //3.须要控制对原始对象的訪问的时候,能够使用保护代理,上边即保护代理实例
  94. //4.须要在訪问对象运行一些附加操作的时候。能够使用智能指引代理

设计模式入门之代理模式Proxy的更多相关文章

  1. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  2. 设计模式学习心得<代理模式 Proxy>

    在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 概述 意图 为其他对象提供 ...

  3. 《JAVA设计模式》之代理模式(Proxy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...

  4. 【转】设计模式(十一)代理模式Proxy(结构型)

    设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...

  5. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  6. 代理模式 PROXY Surrogate 结构型 设计模式(十四)

    代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...

  7. 大熊君说说JS与设计模式之------代理模式Proxy

    一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...

  8. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...

  9. 设计模式——代理模式(Proxy Pattern)

    代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...

随机推荐

  1. hadoop分布式架构和设计

    引言 Hadoop分布式文件系统(HDFS)被设计成适合执行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有非常多共同点.但同一时候,它和其它的分布式文 ...

  2. iOS动画之美丽的时钟

    1.终于效果图 2.实现思路 在ios中默认是绕着中心点旋转的,由于锚点默认在图层的中点,要想绕着下边中心点转,须要改变图层锚点的位置. 依据锚点.设置position坐标.为时钟的中点. 思考秒针旋 ...

  3. Impala ODBC 安装笔记

    Impala在线文档介绍了 Impala ODBC接口安装和配置 http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH5 ...

  4. UVA 4683 - Find The Number

    uva 4683 这题的意思是给一个集合,最多有12个元素. 找出仅仅能被集合中一个仅且一个数整除的第n个数. (n <= 10^15). 我用容斥原理做的.先把能被每一个数整除的元素个数累加, ...

  5. sqlite学习笔记7:C语言中使用sqlite之打开数据库

    数据库的基本内容前面都已经说得差点儿相同了.接下看看如何在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打 ...

  6. Auto property synthesis will not synthesize property &#39;delegate&#39;; it will be implemented by its super

    今天在XCode6.3上面重写TabBar的时候,自己定义tabBar的代理遇到的一个问题 在重写tabBar的代理的时候遇到了一个警告. 解决方法: 在.m文件里 警告消失

  7. Linux 程序设计学习笔记----Linux下文件类型和属性管理

    转载请注明出处:http://blog.csdn.net/suool/article/details/38318225 部分内容整理自网络,在此感谢各位大神. Linux文件类型和权限 数据表示 文件 ...

  8. VC 对话框程序加入工具栏button图标及其buttontooltip

    注意:本人使用VC++2010开发环境进行測试. 在使用VC开发对话框程序时不像开发单文档程序和多文档程序那么方便,非常多资源都须要自己手动加入.近期在开发一个程序时.想尝试在对话框程序里面加入 工具 ...

  9. php5.5安装笔记

    这次没想到本来很简单的php编译,没想到遇到那么多问题.再此记录一下. 1.php5.5编译安装主要有一个难点,就是GD库的问题,因为php5.5的GD库必须是2.1以上的版本哦 原来都是用的gd2. ...

  10. QEMU/KVM磁盘在线备份

    QEMU/KVM磁盘的在线完整及增量备份,是"打包"方案的一种具体实现,可实现基于时间点的备份,同时支持本地与远程2种备份方式,并可指定备份文件进行恢复. tag: qemu, k ...