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