个人理解:
概述:
对其他对象提供一种代理以控制对这个对象的访问。(Provide a surrogate or placeholder for another object to control access to it)。代理模式也叫做委托模式。
使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。
角色:
抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
目标对象角色:定义了代理对象所代表的目标对象。
代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
代理模式的应用场景
结构图:

代理模式的优缺点
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
与其他相关模式
代理则控制对对象的访问;装饰者为对象添加一个或多个功能;适配器为它所适配的对象提供了一个不同的接口
1)适配器模式Adapter: 适配器Adapter 为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。
2) 装饰器模式Decorator: 尽管Decorator的实现部分与代理相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。
代理模式的应用实例
现实中,Proxy应用范围很广,现在流行的分布计算方式RMI和Corba等都是Proxy模式的应用。Spring AOP 日志等操作。
Struts2的Form元素映射就采用了代理模式(准确的说是动态代理模式)[待考证]
代码(其实读UML图要比代码还要一目了然)
动态代理
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:InvocationHandler(Interface)、Proxy。在使用动态代理类时,我们必须实现InvocationHandler接口。
运行结果:
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
补充模式:空对象模式
参考/转自
http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924
http://www.cnblogs.com/cbf4life/archive/2010/01/27/1657438.html
http://blog.csdn.net/jackiehff/article/details/8621517
转载请注明:http://blog.csdn.net/paincupid/article/details/43926757
模式类型:
Proxy 代理模式 - 结构型模式
概述:
对其他对象提供一种代理以控制对这个对象的访问。(Provide a surrogate or placeholder for another object to control access to it)。代理模式也叫做委托模式。
使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。
角色:
抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
目标对象角色:定义了代理对象所代表的目标对象。
代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
代理模式的应用场景
结构图:
代理模式的优缺点
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
与其他相关模式
代理则控制对对象的访问;装饰者为对象添加一个或多个功能;适配器为它所适配的对象提供了一个不同的接口
1)适配器模式Adapter: 适配器Adapter 为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。
2) 装饰器模式Decorator: 尽管Decorator的实现部分与代理相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。
代理模式的应用实例
现实中,Proxy应用范围很广,现在流行的分布计算方式RMI和Corba等都是Proxy模式的应用。Spring AOP 日志等操作。
Struts2的Form元素映射就采用了代理模式(准确的说是动态代理模式)[待考证]
代码(其实读UML图要比代码还要一目了然)
//抽象角色:
abstract public class Subject{
abstract public void request();
}
//真实角色:实现了Subject的request()方法。
public class RealSubject extends Subject{
public RealSubject(){
}
public void request(){
System.out.println("From real subject.");
}
}
//代理角色:
public class ProxySubject extends Subject{
private RealSubject realSubject; //以真实角色作为代理角色的属性
public ProxySubject(){
}
public void request(){ //该方法封装了真实对象的request方法
preRequest();
if( realSubject == null ){
realSubject = new RealSubject();
}
realSubject.request(); //此处执行真实对象的request方法
postRequest();
}
private void preRequest(){
//something you want to do before requesting
}
private void postRequest(){
//something you want to do after requesting
}
}
//客户端调用:
Subject sub=new ProxySubject();
Sub.request();
动态代理
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:InvocationHandler(Interface)、Proxy。在使用动态代理类时,我们必须实现InvocationHandler接口。
被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。
动态代理代码package com.lee;
public interface Subject {
public void request();
}
package com.lee;
public class RealSubject implements Subject{
public RealSubject(){
}
public void request(){
System.out.println("From real subject.");
}
}
package com.lee;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
public class DynamicSubject implements InvocationHandler{
private Object sub;
public DynamicSubject(Object sub){
this.sub = sub;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before calling " + method);
method.invoke(sub,args);
System.out.println("after calling " + method);
return null;
}
}
package com.lee;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Client {
static public void main(String[] args) throws Throwable {
RealSubject rs = new RealSubject(); // 在这里指定被代理类
InvocationHandler ds = new DynamicSubject(rs); // 初始化代理类
Class cls = rs.getClass();
Subject subject = (Subject) Proxy.newProxyInstance(
cls.getClassLoader(), cls.getInterfaces(), ds);
subject.request();
}
}
运行结果:
before calling public abstract void com.lee.Subject.request()
From real subject.
after calling public abstract void com.lee.Subject.request()
所有模式
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
补充模式:空对象模式
参考/转自
http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924
http://www.cnblogs.com/cbf4life/archive/2010/01/27/1657438.html
http://blog.csdn.net/jackiehff/article/details/8621517
转载请注明:http://blog.csdn.net/paincupid/article/details/43926757