代理模式 - 结构型模式

个人理解:      
    

模式类型:

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值