//代理模式定义:为其它对象提供一种代理以控制对这个对象的訪问
//实例:鉴于书中给出的样例不太好。并且有些疑问,所以直接用保护代理作为实例
//要求,一旦订单被创建,仅仅有订单的创建人才干够改动订单中的数据,其它人则不能改动
//这里,代理模式的作用是做訪问控制,即在訪问对象时。中间加一个中转
public interface OrderApi {
public String getProductName();
public void setProductName(String productName,String user);
public int getOrderNum();
public void setOrderNum(int orderNum,String user);
public String getOrderUser();
public void setOrderUser(String orderUser,String user);
}
public class Order implements OrderApi {
private String productName;
private int orderNum;
private String orderUser;
public Order(String productName,int orderNum,String orderUser) {
this.productName = productName;
this.orderNum = orderNum;
this.orderUser = orderUser;
}
//get,set methods
}
public class OrderProxy implements OrderApi {
private Order order = null;
public OrderProxy(Order realSubject) {
this.order = realSubject();
}
public void setProductName(String productName,String user) {
//控制訪问权限,仅仅有创建订单的人员才干够改动
if(user!=null && user.equals(this.getOrderUser())) {
order.setProductName(productName,user);
}else {
System.out.println("对不起"+user+",您没有改动产品名称的权限");
}
}
//相同。下面是setOrderNum和setOrderUser,及get方法。省略
}
public class Client {
public static void main(String[] args) {
OrderApi order = new OrderProxy(new Order("设计模式",100,"张三"));
order.setOrderNum(123,"李四");
//这个设置是无效的,由于李四没有改动张三订单的权限
}
}
//以上是自己写出的代理,事实上Java对代理模式提供了内建的支持
//在java.lang.reflect包下,提供了一个Proxy的类和一个InvocationHandler的接口
//通常把我们自己写的代理叫做Java的静态代理,由于假设Subject接口发生变化。那么代理类
//和详细的目标实现都要变化。不够灵活
//而把Java中内建的对代理模式叫做Java的动态代理,动态代理跟静态代理相比,明显的变化是:
//动态代理实现的时候。尽管Subject接口上定义了非常多方法,可是动态代理类始终仅仅有一个invoke方法
//这样,当Subject接口发生变化的时候,动态代理的接口就不须要跟着变化了
//看实例
public class DynamicProxy implements InvocationHandler {
private OrderApi order = null;
public Order getProxyInterface(Order order) {
this.order = order;
OrderApi orderApi = (OrderApi)Proxy.newProxyInstance(
order.getClass().getClassLoader(),
order.getClass().getInterfaces(),
this);
return orderApi;
}
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
if(method.getName().startsWith("set")) {
if(order.getOrderUser()!=null && order.getOrderUser().equals(args[1])) {
return method.invoke(order,args);
}else {
//无权限
}
}else {
return method.invoke(order,args);
}
}
}
public class Client {
public static void main(String[] args) {
Order order = new Order("设计模式",100,"张三");
DynamicProxy dynamicProxy = new DynamicProxy();
OrderApi orderApi = dynamicProxy.getProxyInterface(order);
orderApi.setOrderNum(123,"李四");
//实际使用的是经过加工的set方法
//无权限
}
}
//代理模式的本质:控制对象訪问
//既然本质是控制对象訪问,意思就是在訪问者与原始对象之间加一个代理就可以
//同理,代理模式也能够通过继承原始类来实现,让訪问者操作继承类,继承类来控制原始对象的訪问
//从而实现控制对象訪问的目的
//何时选用代理模式
//1.须要为一个对象在不同的地址空间提供局部(重点)代表的时候,能够使用远程代理
//2.须要依照须要创建开销非常大的对象的时候。能够使用虚代理(即一个不完整的对象)
//3.须要控制对原始对象的訪问的时候,能够使用保护代理,上边即保护代理实例
//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. sedna载入xml文件

    如果有一个xml文件a.xml.须要把它载入到sedna数据库xml_db里. sedna是通过se_term把xml载入到数据库的.有两种方法: 1.通过se_term的-query參数. se_t ...

  2. 稀疏编码(Sparse Coding)的前世今生(二)

    为了更进一步的清晰理解大脑皮层对信号编码的工作机制(策略),须要把他们转成数学语言,由于数学语言作为一种严谨的语言,能够利用它推导出期望和要寻找的程式.本节就使用概率推理(bayes views)的方 ...

  3. 关于ZipOupputStream添加压缩包常见问题

    其实园子压缩解压缩的方法很多,ZipOupputStream这个类的说明很多,我这边也是从网上找的代码,但是我在压缩的时候遇到了常见的两个问题,第一个就是压缩的时候读取压缩包报该压缩包已经在另一个进程 ...

  4. This Activity already has an action bar supplied by the window decor

    问题描写叙述:继承自AppCompatActivity,使用Toolbar替代ActionBar的时候.出现错误 错误信息: 2.Caused by: java.lang.IllegalStateEx ...

  5. HDU 2054 A==B? 大数

    Problem Description Give you two numbers A and B, if A is equal to B, you should print "YES&quo ...

  6. MySql悲观锁总结与实践

    mysql(for update)悲观锁总结与实践 https://blog.csdn.net/zmx729618/article/details/52701972 悲观锁,正如其名,它指的是对数据被 ...

  7. BZOJ 1806 DP

    思路: f[i][a][b][c][d] 表示在第i天 昨天1矿吃的是a 前天1矿吃的是b 昨天2矿吃的是c 前天2矿吃的是d 的最优解 暴力转移 哦 需要优化一下空间- 变成i%2 就好了 //By ...

  8. 【转】sql 一对多情况下 Group by分组 结果多列合并

    部分原始表数据 需求: 按routineId进行group分组 初步想法(错误): select r * from autowork.dbo.PartOnRoutine where routineId ...

  9. Log4Net快速配置

    1. Log4NET的概念: a) 级别:trace.debug.info.warn.error.fatal.常用debug(调试信息,程序员临时跟踪执行,在正式运行的项目中应该不显示):warn(警 ...

  10. 浅谈javascript的面向对象思想

    面向对象的三大基本特性 封装(把相关的信息(无论数据或方法)存储在对象中的能力) 继承(由另一个类(或多个类)得来类的属性和方法的能力) 多态(一个对象在不同情况下的多种形态) 定义类或对象 第一种: ...