代理模式
- 什么是代理模式?它是一种设计模式
设计模式有:
- 装饰者模式
- 工厂模式
- 单例模式
- 建筑者模式
- 代理模式
等23种模式
-
代理模式的背景
有一个这样的场景:
比如我是三星手机韩国公司 我想把我的产品卖个中国的用户(本质的业务) 怎么做? 我通过我自己去卖给中国的用户是不是太麻烦又太陌生了 所以这个时候我们要找一个比较熟悉中国市场的代理商 找代理商 我们可以通过代理商将我们的产品卖个中国的用户(业务的代理)
由此我们引入代理模式
-
在Java中如何去实现一个代理模式呢?
抽象业务
package org.skyme.proxy; /* 这里是我要实现的业务接口 */ public interface SellService { public String sell(String country); }
具体业务
package org.skyme.proxy; /** * @author:Skyme * @create: 2023-09-13 22:50 * @Description:实现具体业务 */ public class SellServiceImpl implements SellService{ @Override public String sell(String country) { System.out.println("产品卖给了"+country); return "具体业务成功执行"; } }
业务都有了,那么我们现在干什么?
那就是怎么将业务交给代理商
package org.skyme.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * @author:Skyme * @create: 2023-09-13 22:53 * @Description: */ public class ProxyServiceHandler implements InvocationHandler { //具体业务类 private Object object; public ProxyServiceHandler(Object object) { this.object = object; } //做代理了 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //proxy是代理商,method是要代理的业务,args是业务中的参数(相当于我要去卖产品,产品有哪些要卖的) //在这之前可以做一些事情 //比如说,我要调查整个国家的市场 String res = (String)method.invoke(object, args); //在这之后可以做一些事情 //比如反馈结果给公司总部 return res; } }
怎么交付有了,那么怎么去代理呢?
package org.skyme.proxy; import java.lang.reflect.Proxy; /** * @author:Skyme * @create: 2023-09-13 22:58 * @Description: */ public class ProxyTest { public static void main(String[] args) { SellService sell=new SellServiceImpl(); ProxyServiceHandler proxyServiceHandler = new ProxyServiceHandler(sell); SellService o = (SellService)Proxy.newProxyInstance(sell.getClass().getClassLoader(), sell.getClass().getInterfaces(), proxyServiceHandler); System.out.println(o.getClass().getName()); String china = o.sell("China"); System.out.println(china); } }
怎么去理解?
首先我业务先出来,然后我要交付给代理商,那么我这里相当于实现了代理商是怎么样的,然后怎么交付的,代理商要做什么
这里是具体业务:
SellService sell=new SellServiceImpl();
这里是代理商以及交付给代理商去实现
ProxyServiceHandler proxyServiceHandler = new ProxyServiceHandler(sell);
这里是给出真正的代理商
SellService o = (SellService)Proxy.newProxyInstance(sell.getClass().getClassLoader(), sell.getClass().getInterfaces(), proxyServiceHandler);
真正的代理商执行方法:
String china = o.sell("China");
总结
就是我们其实并不关心代理商到底是谁,·而我们作为总部只需要去关心到底是怎么代理的业务,通俗一点来说就是我去看下你这个代理的业务行得通不,我可以跟你说下一些怎么实现业务等等,所以代理模式很像装饰者,装饰者模式是对一个业务的优化增强,而代理模式呢是对业务的拓展
装饰者模式更强调自身
代理模式更强调代理商要做的业务