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

java设计模式之代理模式【设计模式】

作者头像
简单的程序员
发布2020-04-18 00:33:43
6450
发布2020-04-18 00:33:43
举报
文章被收录于专栏:奕仁专栏奕仁专栏

先讲一个段子,有四个人物,分别是张三,我,张三老婆,日本某公司(自己脑补哈)

静态代理

张三想要去日本某公司买xxx,但是对于经费等等一系列的原因然后就放弃了这个念头,我刚好要去日本玩的,张三得知我要去日本,他就偷偷给我说,他想要一个size为D的xxx,让我帮他代购一个,于是我就带着他的需求去日本某公司购入了xxx,然后买完之后回国拿给了张三。 在这个过程中,我作为代理对象(我带着张三的需求【购买的动作即为接口,他的需求即为方法和参数】),张三作为被代理对象。我帮他购买这个过程就叫做代理。 又有一个环境,即当张三的老婆也需要女性的xxx,也偷偷的让我代购,那么我又要亲自过去帮她买,但是想想,我作为一个d代理,一会儿帮这个买,一会儿帮那个买,每次买的东西还不一样,想想,如果作为代码写成一个系统代码是不是会非常的多?

动态代理

我开了一家代购公司,张三联系到我们公司,我们公司的A员工刚好要去日本做代购,于是带着他的需求去代购了,张三老婆也要买日本的另外一款产品,B员工帮他去代购了,这样的代理对象永远都是动态的(Proxy.newInstance(classLoader,classes,invocationHandler)),并且一旦根据被代理对象的需求买完产品之后(method.invoke即执行被代理对象的目标方法)带回过国。 接下来用代码实现以下动态代理:

首先,先创建一个interface

IHello 目标接口类

代码语言:javascript
复制
interface IManFanctory {
        Object buy(int size);
 }

然后再写一个目标类的实现类

代码语言:javascript
复制
class ManFanctoryImpl implements  IManFanctory {
     @Override
        public  Object buy(int size) {
            System.out.println("buying!");
			return "size:" + size;
        }
 }

最后再手动编写一个代理类

代码语言:javascript
复制
//需要实现InvocationHandler接口完成代理
class ManProxy implements InvocationHandler {
 //目标接口 目的拿到目标接口的所有信息
	private IManFanctory  hello; 
	public ManProxy(IManFanctory hello) {
		this.hello = hello;
	}  
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
	   //利用反射执行该方法  参数1 目标类,参数2  目标类的参数
		return method.invoke(hello, args);
	}
}

然后写一个客户端,对该代理进行操作:

代码语言:javascript
复制
@org.junit.Test
public void test() {
	//目标类的类加载器  目标类实现的接口  代理类
	IManFanctory  hello = new ManFanctoryImpl();
	//调用jdk代理方法 实现对classLoader的操作,完成代理,最后使用代理对该方法进行代理操作
	IHello tho = (IHello)Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(),
			(proxy, method, args) -> {
				return method.invoke(hello, args);
			});
	tho.buy(36);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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