专栏首页大大的微笑设计模式之代理模式

设计模式之代理模式

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

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

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方式(代理具体类):

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();

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java如何根据二进制流确定图片的类型

     为什么需要这样做? 因为仅仅通过后缀名我们并不能得知用户是否把图片的类型更改为其他类型. public enum ImageType { PNG('P','...

    用户1215919
  • 设计模式之单例模式深究

    为什么使用单例模式?         我认为是由于某些对象的创建比较耗时,对内存的消耗又比较大回收成本过高,这时候如果允许 不断的创建对象代价势必太高,如果...

    用户1215919
  • Spring Cloud netflix ribbon源码分析

    用户1215919
  • Java中的引用传递

    我觉得引用传递  真的很好理解,不知道为什么大家觉得这么难,你只要掌握这几点就可以了

    wust小吴
  • …… are only available on JDK 1.5 and higher 错误(spring 的jdk版本检测在jdk 8下的修订)

    1、在项目中创建一个package为org.springframework.core 2、在该package下面新建JdkVersion.java,内容如下...

    ydymz
  • 短视频直播源码,日夜模式切换配置

    yunbaokeji柯基
  • BeanWrapper解析

    爱撒谎的男孩
  • Java修饰符

    访问控制修饰符定义类、变量、方法的访问权限。Java支持4种访问控制修饰符:public, protected, default, private.

    润森
  • 一份Java基础知识笔试题附答案

    框架师
  • 第二节:Java入门第一行代码

    学习Java基础课程,学会使用eclipse,eclipse为Java集成开发坏境IDE,创建第一个Java源文件代码:

    达达前端

扫码关注云+社区

领取腾讯云代金券