`
kangsg219
  • 浏览: 121796 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

学习笔记之代理模式(2)

阅读更多
在动态代理中动态代理类不再服务于特定的对象与接口,而是服务于他绑定的对象,绑定是动态的。而实际工作的类也不插入任何和业务无关的动作。要调用是,绑定他即可。

接口类:IBuySome.java

package org.kangsg219.DynamicProxy;

public interface IBuySome {
	public void buy();
	public void buy(String something);
}


被代理对象:BuySomeImpl.java

package org.kangsg219.DynamicProxy;

public class BuySomeImpl implements IBuySome {

	public void buy() {
		System.out.println("买个手机。(BuySomeImpl类中的buy方法。)");
	}
	
	public void buy(String something) {
		System.out.println("买个"+something+"。(BuySomeImpl类中的buy方法。)");

	}
	
}



代理对象:BuySomeProxy.java

package org.kangsg219.DynamicProxy;

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

public class BuySomeProxy implements InvocationHandler{
	
	private Object obj;
	
	public Object bind(Object obj){
		this.obj=obj;
		/**
		 * java.lang.reflect.Proxy中的方法
		 * arg0 - 定义代理类的类加载器
		 * arg1 - 代理类要实现的接口列表
		 * arg2 - 指派方法调用的调用处理程序
		 */
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);		
	}
	
	/**
	 * 实现InvocationHandler接口中的方法。
	 * arg0:被绑定对象。
	 * arg1:被绑定对象的方法(如TestMain中的buy方法)。
	 * arg2:被绑定对象的方法的参数组,是个可变参数(如buy中的String类型的"手机");
	 *      如果没有参数则arg2为null。
	 */
	public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
		
		this.beforBuy();

		return arg1.invoke(obj, arg2);//java.lang.reflect.Method类中的方法
	}
	
	public void beforBuy(){
		System.out.println("在买东西前执行的一些动作。(BuySomeProxy类中附加的方法。)");
	}
	public void afterBuy(){
		System.out.println("在买东西前执行的一些动作。(BuySomeProxy类中附加的方法。)");
	}
}


测试类:TestMain.java

package org.kangsg219.DynamicProxy;

/**
 * @author kangsg219
 *
 *	测试类
 */
public class TestMain {
	
	public static void main(String[] args) {
		
		BuySomeProxy bsp=new BuySomeProxy();
		
		IBuySome ibs=(IBuySome)bsp.bind(new BuySomeImpl());

		ibs.buy("手机");//调用BuySomeProxy中的invoke方法。	
		
	}

}


运行结果:

在买东西前执行的一些动作。(BuySomeProxy类中附加的方法。)
买个手机。(BuySomeImpl类中的buy方法。)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics