代理模式,通俗的话说:就是代理,代理这个词我们也经常用,比如代理一个人办事,就是因为那个人不方便去办理,委托一个人去代理他
办理,这里我们就用这个最基础的模型来说明代理模式:
简单理解:
因为对象不能直接访问,或者直接访问存在问题,这时候就需要在我们和被访问的对象之间加一层访问层,通过访问层来间接的访问对象的方法
灵魂画师 开始
老司机们都懂,大家都懂,这个图用来说代理模式,实在是再合适不过了!!
这里涉及到三个需要说明的对象
定义一个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("处理器代理类"); if (method.getName().equals("selectContext")) { System.out.println("调用的是Google selectContext方法"); int invoke = (int) method.invoke(google, args); System.out.println("处理结果:" + invoke); return invoke; } else { System.out.println("处理器调用google其他方法:"); return null; } } }
这里我们未直接调用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.cnblogs.com/ChromeT/p/11756401.html