动态代理之渣男的滑铁卢

渣男小明想跟隔壁班的小红谈恋爱,但是小明不认识小红,小明的朋友小方认识小红,小明就委托小方送礼物给小红。第二天小明又见到了隔壁班的小兰,惊若天人,一眼万年,但是小明还是不认识小兰,小方恰好又认识,小明就继续委托小方送礼物给小红。这时候的小方就是代理。
先定义个渣男小明接口

public interface xiaoming{
	public void 送礼物();
}

再定义个小红类

public class xiaohong implements xiaoming{//谁想继承你啊死渣男!
	@Override
	public void 送礼物(){
		System.out.println("送你个礼物");	
	}
}

再定义个小兰类

public class xiaohong implements xiaolan{//谁想继承你啊死渣男!
	@Override
	public void 送礼物(){
		System.out.println("送你个礼物");	
	}
}

如果正常送那就是

public static class main(String[] args){
	xiaoming love=new xiaohong();
	xiaohong.送礼物();
}

那小红就不认识小明,她跟他费什么话,不收礼物!我不我不!
这时候小方出场了
再定义一个小方类

public class xiaofang implement InvocationHandler{
	private Object target;
	public Object bind(Object tar) {
       		this.tar = tar;
        		return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
                                      tar.getClass().getInterfaces(),this);
   	}
	public Object invoke(Object proxy , Method method , Object[] args) throws Throwable {
        		Object result = null;
       		 //在调用具体函数方法前,执行功能处理	
	

        		result = method.invoke(tar,args);
       		
        		
        		//在调用具体函数方法后,执行功能处理
       		return result;
   	}
}

这时候送礼物就是

public static class main(String[] args){
	xiaofang proxy=new xiaofang();
	xiaoming love=(xiaoming) proxy.bind(new xiaohong());
	love.送礼物();
	xiaoming love=(xiaoming) proxy.bind(new xiaolan());//我想送谁就送谁,我是渣男我骄傲!(瞧瞧这是人话嘛???)
}

而身为一个渣男,怎么可能只在一棵树上吊死,那两边都要哄,还可以用不同的方式去哄,小方这时候就可以起作用了,他可以在送小红花之前给花剪个造型,或者给花装个礼盒;送小兰呢就。可以除了送花还可以送洋娃娃。这就是动态代理。
那如果是对送礼物方法进行重写的话,如果渣男小明又看上了个,那岂不是送礼物要改来改去??小明这渣男哪有那么多时间来搞这种事情,这不是还有小方好兄弟,好兄弟看你啦,继续修改小方动态代理类。

public class xiaofang implement InvocationHandler{
	private Object target;
	public Object bind(Object tar) {
       		this.tar = tar;
        		return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
                                      tar.getClass().getInterfaces(),this);
   	}
public Object invoke(Object proxy , Method method , Object[] args) throws Throwable {
        		Object result = null;
       	//在调用具体函数方法前,执行功能处理	
	
		System.out.println(“买个礼盒装花花”);
		System.out.println(“礼盒里面在放个香水”);
		System.out.println(“再放个口红,回去一定要这个渣男大出血,我日我还是单身狗!”);
        		result = method.invoke(tar,args);
       		
        //送完礼物了看小姐姐反应,有好感再告诉他。
		//tmd我看小姐姐也好看,好兄弟我替你先试一试,免得你受爱情的苦!!!
		//从此小方和小姐姐过上了幸福快乐的日子。
		
        		//在调用具体函数方法后,执行功能处理
       		return result;
   	}
}

就这样小明被小方挖了墙角,堪称渣男界的滑铁卢
这就是动态代理的作用,活该这个渣男小明谈不到恋爱,想泡人家还要靠僚机?不主动怎么撩的到???
代理还是很有用的,在需要扩展某些相同功能的时候,如果对实现接口的类进行重写,那会花费很多时间的,而改用动态代理在代理的时候添加功能,就能很方便了,这也能进行代码的解耦,减轻了程序猿的压力,少掉点头发。
动态代理在Spring中有很大的作用,AOP就是基于动态代理来完成面向切面编程的。还有IOC中的依赖注入也依据了代理的原理。
小白写了个段子加深自己对于动态代理的理解,如果大家看得开心点个赞。如有指正请评论区告诉我。然后转载可以请注明出处,谢谢!

发布了7 篇原创文章 · 获赞 3 · 访问量 1179

猜你喜欢

转载自blog.csdn.net/qq_38980636/article/details/102797156