Java之代理模式

帅比萌擦擦* 提交于 2019-12-26 00:04:20

代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法

静态代理

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
package com.teenyda.静态代理;public class Demo1 {		public static void main(String[] args) {		IInsert stu = new StuDao();		IInsert proxy = new InsertProxy(stu);		proxy.insert("insert into p values....");		proxy.update("update stu set ...");	}}interface IInsert {	void insert(String sql);	void update(String sql);}class InsertProxy implements IInsert {	private IInsert obj;		public InsertProxy(IInsert obj) {		this.obj = obj;	}		@Override	public void insert(String sql) {		System.out.println("开始执行:");		obj.insert(sql);		System.out.println("执行完毕!");	}	@Override	public void update(String sql) {		System.out.println("开始执行");		obj.update(sql);		System.out.println("执行完毕!");	}}class StuDao implements IInsert {	@Override	public void insert(String sql) {		System.out.println(sql);	}	@Override	public void update(String sql) {		System.out.println(sql);	}}

动态代理

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
package com.teenyda.动态代理;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class Demo2 {	public static void main(String[] args) {		// TODO Auto-generated method stub		ILogin user = new Usre();		InvocationHandler handler = new UserHandler(user);		Class<?> clazz = user.getClass();		ILogin u = (ILogin)Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), handler);		u.login("张三");		u.killBoss("张三");	 大专栏  Java之代理模式	u.update("张三");	}		}//接口interface ILogin{	void login(String name);	void killBoss(String name);	void update(String name);}//被代理类class Usre implements ILogin{	@Override	public void login(String name) {		// TODO Auto-generated method stub		System.out.println(name+"登录啦!");	}	@Override	public void killBoss(String name) {		// TODO Auto-generated method stub		System.out.println(name+"击杀boss啦!");	}	@Override	public void update(String name) {		// TODO Auto-generated method stub		System.out.println(name+"升级啦!");	}		}//代理类class UserHandler implements InvocationHandler{	private Object obj;	public UserHandler(Object obj) {		this.obj = obj;	}	@Override	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {		System.out.print("log:");		method.invoke(obj, args);		System.out.println("正在记录!");		return args;	}}

动态代理-之Cglibcloud-cglib.jar

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
package com.teenyda.MethodInterceptor代理;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/*** @author  作者 E-mail: * @date 创建时间:2018年1月21日 上午9:55:04 * @version 1.0 * @parameter  * @since  * @return  */public class Demo3 {	public static void main(String[] args) {		// TODO Auto-generated method stub		ManagerProxy proxy = new ManagerProxy();		Manager m = (Manager)proxy.getProxy(Manager.class);		m.root();				ManagerProxy p2 = new ManagerProxy();		Super s = (Super)p2.getProxy(Super.class);		s.delete();	}}class Manager{	public void root() {		System.out.println("执行root");	}}class Super{	public void delete() {		System.out.println("执行删除操作!");	}}class ManagerProxy implements MethodInterceptor{	private Enhancer enhancer = new Enhancer();	public Object getProxy(Class<?> clazz) {		enhancer.setSuperclass(clazz);		enhancer.setCallback(this);		return enhancer.create();	}		@Override	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {		System.out.println("截拦!");		proxy.invokeSuper(obj, args);		System.out.println("保存!");		return null;	}	}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!