代理模式

含义:

  为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。一个类代表另一个类的功能。这种类型的设计模式属于结构型模式

结构:

  

实现:

1)静态代理模式

 1 服务类接口
 2 // 创建服务类接口
 3 public interface BuyHouse {
 4     void buyHouse();
 5 }
 6 实现服务类接口,顾客
 7 // 实现服务接口,这个类是一个顾客类,想要购买房屋
 8 public class Customer implements BuyHouse {
 9     public void buyHouse() {
10         System.out.println("我要买房!");
11     }
12 }
13 实现服务类接口,中介
14 // 创建代理类,这个类是一个中介类,他负责为顾客买房
15 public class Agency implements BuyHouse{
16     private BuyHouse buy;
17     public Agency(final BuyHouse buy) {
18         this.buy = buy; 
19     }
20     public void buyHouse() {
21         System.out.println("买房前准备");
22         buy.buyHouse();
23         System.out.println("买房后准备");
24     }
25 }

优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展

缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。

2)动态代理模式

 1 服务类接口
 2 // 创建服务类接口
 3 public interface BuyHouse {
 4     void buyHouse();
 5 }
 6 编写动态处理器
 7 public class DynamicProxy implements InvocationHandler{
 8     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 9         System.out.println("开始执行方法");
10         if("toString".equals(method.getName())) {
11             return proxy.getClass().getName();
12         }else if("buyHouse".equals(method.getName())) {
13             System.out.println("准备购买房屋");
14             return proxy; 
15         }
16         return null; 
17     }
18     public static <T> T newInstance(Class<T> c) {
19         Class[] t = {c};
20         Object obj = Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(), t, new DynamicProxy());
21         return (T)obj;
22     }
23 }

优缺点:

  优点:1、职责清晰2、高扩展性3、智能化

  缺点:1、由于在客户端和真实主体之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

     2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

使用场景:

  远程代理、虚拟代理、Copy-on-Write代理、保护(Protect or Access)代理、Cache代理、防火墙(Firewall)代理、同步化(Synchronization)代理、智能引用(Smart Reference)代理

原文地址:https://www.cnblogs.com/HuiH/p/11950239.html