13 【结构型】代理模式~ 理解与使用
代理模式
代理模式,通俗的话说:就是代理,代理这个词我们也经常用,比如代理一个人办事,就是因为那个人不方便去办理,委托一个人去代理他
办理,这里我们就用这个最基础的模型来说明代理模式:
简单理解:
因为对象不能直接访问,或者直接访问存在问题,这时候就需要在我们和被访问的对象之间加一层访问层,通过访问层来间接的访问对象的方法
灵魂画师 开始
老司机们都懂,大家都懂,这个图用来说代理模式,实在是再合适不过了!!
这里涉及到三个需要说明的对象
真实对象:这里的Google是真实对象,它具有可以检索的方法。
代理对象:代理对象可以简单的理解为就是真实对象的一个副本,可以直接拿过来用。
处理器:处理器就是如何来调用代理后对象的方法的一个类
代码理解:
定义一个google的接口,这里可以进行搜索内容
public interface Google { //搜索内容 int selectContext(); }
去实现这个接口,并且调用这个接口的时候,我们表示出,它正在搜索内容
public class MyGoogle implements Google { @Override public int selectContext() { System.out.println("google 搜索引擎检索中。。。。"); return 0; } }
注意:这里实现了Java自带的一个类,InvocationHandler 用于实现处理器,处理器用来处理相关逻辑
public class MyInvocationHandler implements InvocationHandler { //真实调用的对象 private Google google; public MyInvocationHandler(Google google) { this.google = google; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理类处理before....."); int invoke = (int) method.invoke(google, args); System.out.println("处理结果:" + invoke); System.out.println("代理类处理after....."); return invoke; } }
这就和Spring AOP 切面编程里面的代理是一样的,在代理的方法之前做一件事情,方法后做一件事情
这里我们未直接调用google的检索方法,而是调用代理对象的检索方法,实现同样的效果,
public static void main(String[] args) { //真实对象 Google google = new MyGoogle(); //处理器 MyInvocationHandler invocationHandler = new MyInvocationHandler(google); //代理对象 Google proxyMapper= (Google) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{Google.class},invocationHandler); proxyMapper.selectContext(); }
参考内容:https://www.runoob.com/design-pattern/proxy-pattern.html
https://www.jianshu.com/p/d0ee1ca57f14
码云:https://gitee.com/mrc1999/23GOF
但行好事,相信技术,转载请注明出处