前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之代理模式

设计模式之代理模式

作者头像
用户1215919
发布2018-02-27 10:51:13
5040
发布2018-02-27 10:51:13
举报
文章被收录于专栏:大大的微笑

       代理模式是一种注重过程的一种模式,在我们做某一具体事情之前或之后做一些辅助性的工作; 好处是将辅助工作从主要工作中抽离出来,但是又能协同工作, 我们只关心主要业务,对于不关心的事情交给代理来做,实现代理需要两个对象:被代理者,执行者

JDK中提供的动态代理(只能代理接口): 

代码语言:javascript
复制
public interface IBuy {
	void pay();
}

public class Buy implements IBuy{

	@Override
    public void pay() {
	    System.out.println("订单支付完成!");
    }

public class PayProxy implements InvocationHandler {
	private Object obj;
	public PayProxy(Object target) {
	   this.obj = target;
    }

	public Object newInstance() {
		Class<? extends Object> cls = obj.getClass();
		return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), this);
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object res = method.invoke(obj, args);
		System.out.println("----------");
		sendMsg();
		return res;
	}
	
	private void sendMsg(){
		System.out.println("买家已付款,请尽快发货!");
	}
}

--------------
IBuy buy = (IBuy)new PayProxy(new Buy()).newInstance();
		buy.pay();


console:
订单支付完成!
----------
买家已付款,请尽快发货!

CGLIB方式(代理具体类):

代码语言:javascript
复制
public class Buy{
    public void pay() {
	    System.out.println("订单支付完成!");
    }

}

public class CglibPayProxy implements MethodInterceptor {
	private static final CglibPayProxy PROXY = new CglibPayProxy();
	private CglibPayProxy() {
	}

	public static CglibPayProxy getInstance() {
		return PROXY;
	}

	@SuppressWarnings("unchecked")
	public <T> T newProxy(Class<T> clazz) {
		Enhancer enhancer = new Enhancer();
		 enhancer.setSuperclass(clazz);
		 enhancer.setCallback(this);
		 return (T) enhancer.create();
	}

	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3)
	        throws Throwable {
		Object res = arg3.invokeSuper(arg0, arg2);
		System.out.println("------------");
		sendMsg();
		return res;
	}

	private void sendMsg() {
		System.out.println("买家已付款,请尽快发货!");
	}


Buy buy = CglibPayProxy.getInstance().newProxy(Buy.class);
		buy.pay();
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档