设计模式——代理模式

代理模式的作用是控制和管理访问

转载请说明出处:http://blog.csdn.net/dawanganban

先看一段代码:

package com.test;
/**
 * 抽象角色
 * @author Administrator
 *
 */
abstract public class Subject {
	abstract public void request();
}

package com.test;
/**
 * 真实角色
 * @author 阳光小强
 *
 */
public class RealSubject extends Subject{
	public RealSubject(){
		
	}
	
	public void request(){
		System.out.println("From real subject");
	}
}
package com.test;
/**
 * 客户端调用
 * @author 阳光小强
 *
 */
public class Main {
	public static void main(String[] args) {
		Subject sub = new RealSubject();
		sub.request();
	}
}
上面代码应该很容易看懂,下面我们使用代理模式(新增一个ProxySubject类)

package com.test;

/**
 * 
 * @author 阳光小强
 *
 */
public class ProxySubject extends Subject{
	private RealSubject realSubject; //以真实角色作为代理角色的属性
	
	public ProxySubject(){
		
	}

	@Override
	public void request() {
		preRequest();
		
		if(realSubject == null){
			realSubject = new RealSubject();
		}
		realSubject.request();
		
		postRequest();
	}
	
	private void preRequest(){
		//something you want to do before requesting 
	}
	
	private void postRequest(){
		//something you want to do after requesting 
	}

}

客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题。

 

有时候我们需要代理的对象不确定,所以就需要动态代理,Java中的动态代理模式实现如下:

package com.test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicSubject implements InvocationHandler {  
      
    private Object dele;  
      
    public DynamicSubject(Object obj) {  
        this.dele = obj;  
    }  
      
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
        doBefore();  
        //在这里完全可以把下面这句注释掉,而做一些其它的事情  
        Object result = method.invoke(dele, args);  
        after();  
        return result;  
    }  
      
    private void doBefore() {  
        System.out.println("before....");  
    }  
      
    private void after() {  
        System.out.println("after....");  
    }  
}  
package com.test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * 客户端调用
 * @author 阳光小强
 *
 */
public class Main {
	public static void main(String[] args) throws Exception {
		RealSubject rs = new RealSubject(); //被代理的类
		InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
		
		Subject subject = (Subject) Proxy.newProxyInstance(rs.getClass().getClassLoader(), rs.getClass().getInterfaces(), ds);
		subject.request();

	}
}

posted on 2014-07-01 21:51  岚之山  阅读(205)  评论(0编辑  收藏  举报

导航