代理模式的英文叫做Proxy或Surrogate,所谓代理,就是一个人或者一个机构代表一个机构采取行动。
在一些情况下,一个客户不想活着不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起起到中介作用。
代理模式
代理的例子:
Windows系统提供的快捷方法,可以使任何对象同时出现多个地方,而不必修改原对象。对快捷方式的调用完全与对原对象的调用一样。
一个名为link1的快捷方式是一个名为explorer.exe的文件的代理。
代理模式的结构:
代理主题角色(Interface):
声明了真是主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以使用代理模式
代理主题角色(Proxy):
代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在儿女和时候都可以替代真是主题;控制对真是主题的引用,负责在需要的时候创建主题对象(和删除真是主题对象);代理角色通常在将客户调用传递真实的主题之前或者之后,都要执行某个操作,而不是单纯的将调用船体给真实主题对象。
真实主题对象:
定义了代理角色所代表的真实对象这里给出了一个非常简单的示意性实现,下面给出的是主题角色的示意性源代码:
package com.javapatterns.proxy;
abstract public class Subject
{
//声明一个抽象的请求方法
abstract public void request();
}
下面是具体主题角色的示意性源代码:
package com.javapatterns.proxy;
public class RealSubject extends Subject
{
public RealSubject(){}
//实现请求方法
public void request()
{
System.out.println("From real subject");
}
}
下面是代理主题角色的源代码,代理主题除了将所有的请求原封不动地委派给真实角色之外,还在委派之前和之后分别执行一个preRequset()操作和一个postRequest()操作。
package com.javapatterns.proxy;
public class ProxySubjext extends Subject
{
private RealSubject realSubject;
public ProxySubject(){}
//实现请求方法
public void request()
{
preRequest();
if(realSubject==null)
{
realSubject=new RealSubject();
}
realSubject.request();
postRequest();
}
//请求前的操作
private void preRequest()
{
//something your want to do before requesting
}
//请求后的操作
private void postRequest()
{
//something you want to do after requesting
}
}
在使用代理主题时,要将变量的明显类型声明为抽象主题的类型,而将其真实类型设置为代理主题类型,如下所示
--------------------------------------------------------------------------------
Subject subject = new ProxySubject(); subject.request();
--------------------------------------------------------------------------------
动态代理:
动态代理创建步骤:
(1)指明一系列的接口来创建一个代理对象
(2)创建一个调用处理器(Invocation Handler)对象
(3)将这个代理指定为某个其他对象的代理对象
(4)在调用处理器的invoke()方法中采取处理,一方面将调用传递给真实对象,另一个方面执行各种需要的操作。
事例:
public class VectorProxy implements InvocationHandler
{
//代理对象
private Object proxyobj;
//构造函数
public VectorProxy(Object obj)
{
this.proxyobj=obj;
}
//静态工厂方法
public static Object factory(Object obj)
{
Class cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new VectorProxy(obj));
}
//代理对象的处理函数(实现InvocationHandler接口函数)
/**
*proxy代理对象,这里是proxyobj
*method代理对象执行被代理对象的函数,相当于C++中的函数指针,但Method是个封装函数指针的类,我个人这么认为的^_^
*args是执行函数method的参数数组
*/
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable
{
System.out.println("调用"+method.toString()+"之前");
if(args!=null)
{
System.out.println("调用参数:");
for(int i=0;i<args.length;i++)
{
System.out.println(args[i]+"/");
}
}
Object o = method.invoke(proxyobj,args);
System.out.println("调用"+method.toString()+"之后");
System.out.println("___________________________________________________");
return o;
}
public static void main(String[] args)
{
List v = null;
//List是Vector实现的一个接口,所以可以用这个接口指向实际的代理对象,详细问题查Jdk去,
//我一般很负责任的,只是有时候偷懒
v = (List)factory(new Vector());
v.add("Hello");
v.add("ByeBye");
v.add(1,"Welcome");
v.remove(0);
v.remove(1);
}
}
也就是说代理对象截获了对Vector对象的所有调用,再调用传递给Vector之前和之后,代理对象具有采取合适操作的灵活性,虽然这里代理对象采取的操作不过就是打印出两种信息。
分享到:
相关推荐
### 浅谈Java代理机制 #### 一、引言 在深入探讨Java代理机制之前,我们首先需要了解代理模式的基本概念及其应用场景。代理模式是一种结构型设计模式,它为其他对象提供了一种代理以控制对这个对象的访问。在Java...
代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口.根据代理模式的...
JAVA设计模式之代理模式 代理模式是结构型模式之一,它主要解决了直接访问对象时带来的问题,如对象创建开销很大、某些操作需要安全控制、需要进程外的访问等。代理模式的目的是提供一种代理,以控制对这个对象的...
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 3. 行为型设计模式: - 责任链模式:避免向多个对象分发请求,将请求沿着处理者链传递,直到被处理。 - 命令模式:将请求封装为一个对象,以便于...
2. **结构型模式**:包括适配器(Adapter)、装饰器(Decorator)、代理(Proxy)、桥接(Bridge)、组合(Composite)、外观(Facade)和享元(Flyweight)。这些模式关注于如何将类和对象组合在一起,以形成更大的...
- 定义了一个委托类型,用于代理具体的观察者方法。 - 定义了一个事件,该事件的类型即为前面定义的委托类型。 - 提供了一个触发事件的方法,当目标的状态发生改变时,可以通过这个方法触发事件,从而通知所有已...
计算机视觉包括图像处理和模式识别,自然语言处理涉及语音识别、合成和对话系统,认知与推理包含了模拟人类思维和决策过程的研究,机器人学则聚焦于机器人的设计、控制和规划,博弈与伦理关注多代理系统的交互,而...
5. **推进国际合作**:借鉴国外成熟市场的经验,如日本、美国和英国的税务代理制度,结合我国实际情况,探索适合我国国情的税务代理模式。 总结来说,我国税务代理行业虽面临诸多挑战,但通过加强法制建设、提高...
本篇将深入探讨12种核心的设计模式,它们是:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式、适配器模式、装饰器模式、代理模式、桥接模式、组合模式、享元模式和观察者模式。 1. **单例模式**:确保一...
许多平开门代理坚持传统经营模式,事必躬亲,不信任或不愿意授权给店员,这限制了团队的成长和效率。随着市场的扩大和竞争加剧,单靠个人力量已无法应对,团队合作变得至关重要。如果代理不能建立一个有能力的经营...
例如,代理型管理模式侧重于机场运营的代理和咨询服务,风险型管理模式强调风险分担和控制,设计建造模式(Design-Build)则将设计和建造任务交由同一承包商,这样可以在很大程度上简化流程并缩短工期。BOT模式...
- 委托招标代理单位计算工程量清单,编制招标文件。 - 招标文件需明确工程量计算规则、合同形式、保函等关键事项。 - 可以计算标底,也可不设标底。 2. 投标阶段: - 投标单位根据工程量清单和招标文件编制投标...
浅谈Spring中用到的设计模式及应用场景 Spring 框架是 Java 企业级应用程序的核心组件之一,它提供了强大的功能和灵活的架构来简化企业级应用程序的开发。Spring 框架使用了多种设计模式来实现其功能,本文将对 ...
在营销组织方面,中国早期的汽车营销主要由国有企业主导,随着市场经济的推进,营销组织形式逐渐多样化,包括总代理、区域代理、特许经销和品牌专卖店等。这些变化提升了汽车销售的灵活性,为消费者提供了更多选择。...
### 编译原理浅谈与分歧 #### 编译原理概览 编译原理作为计算机科学中的一个核心领域,主要研究程序如何从一种形式转换到另一种形式,特别是从高级语言到机器代码的过程。这一过程涉及多个步骤,包括词法分析、...
在《Web安全架构浅谈》中,主要讨论了Web安全的多个方面,包括安全架构、扫描器、WAF(Web应用防火墙)以及面临的挑战和解决方案。以下是详细的知识点解析: 1. **Web安全扫描器**: - 扫描器用于检测Web应用中的...
【房地产售后返租经营模式】 房地产售后返租是一种创新的商业模式,旨在吸引购房者并确保商业项目的稳定运营。在这个模式中,开发商不仅销售商品房,还同时与购房者签订租赁合同,承诺在一定期限内统一经营管理购房...
不同于适配器模式和桥接模式,装饰器模式涉及的是单方,和代理模式相同,而且目标必须是抽象的。在实际上,装饰器模式和代理模式的实现方式基本一致,只在目标的存在上有些差别。 二、初步分析 在装饰器模式中,...
这种模式的优点在于利用了代理商的专业营销能力和广泛的销售网络,但也存在信息不对称、目标不一致等问题,可能导致冲突并对生产商产生负面影响。 另一种模式是自建营销通路,如高度垂直一体化的全国分销网络。这种...
代理模式的代码实现可能包括静态代理和动态代理(如Java的`java.lang.reflect.Proxy`)。 6. **观察者模式**:定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新...