`

代理模式

阅读更多
为一个对象提供一种代理来控制对该对象的访问。代理模式给某一个对象提供一
个代理对象,并由代理对象控制对源对象的引用。

<<大话设计模式>>中的代理模式,最简单的原型:
public class Proxy extends Subject {
	Subject realSubject;
	@Override
	public void request() {
		if(realSubject==null){
			realSubject=new RealSubject();
		}
		realSubject.request();
	}
	public static void main(String[] args) {
		Proxy proxy=new Proxy();
		proxy.request();
	}

}

public class RealSubject extends Subject {

	@Override
	public void request() {
		System.out.println("really request");

	}

}

public abstract class Subject {
	public abstract void request();
}


//使用JDK提供的Proxy类和InvocationHandler接口实现动态代理。
public interface IHello {

	void sayHello(String name);

	void sayGoogBye(String name);
}

public class Hello implements IHello {

	@Override
	public void sayGoogBye(String name) {
		  System.out.println(name+" GoodBye!");
	}

	@Override
	public void sayHello(String name) {
		  System.out.println("Hello " + name);
	}

}

public class DynaProxyHello implements InvocationHandler {

	private Object delegate;


	public Object bind(Object delegate) {
		this.delegate = delegate;
		return Proxy.newProxyInstance(
				this.delegate.getClass().getClassLoader(), this.delegate
						.getClass().getInterfaces(), this);
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		 try {
	            System.out.println( method.getName() + " Method Start .");
	            
	            result = method.invoke(this.delegate, args);
	            System.out.println( method.getName() + " Method end!");
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        return result;
	}

}

public class Test {
	public static void main(String[] args) {
		IHello hello = (IHello) new DynaProxyHello().bind(new Hello());
		hello.sayHello("tom cat");
		hello.sayGoogBye("tom cat");
	}   
}



Spring框架的设计理念与设计模式(8)-代理模式
http://javapub.iteye.com/blog/751652
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics