代理模式
Overview
代理模式(Design Pattern),就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。
它使得客户不能直接与真正的目标对象通信。
代理对象是目标对象的代表,其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。
代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的,同时也在一定程度上面减少了系统的耦合度。
主要解决
在直接访问对象时带来的问题。
比如说:要访问的对象在远程的机器上。
在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
何时使用
想在访问一个类时, 进行一些控制
应用实例
- 买火车票,不一定要去火车站,也可以去代售点
- Spring AOP
优点
实现
Designer Interface
1 2 3 4 5 6 7 8
| public interface IDesigner {
void implementsDemand(String demandName); }
|
Java Designer
1 2 3 4 5 6 7 8 9 10 11 12
| public class JavaDesigner implements IDesigner { private final String name;
public JavaDesigner(String name) { this.name = name; }
@Override public void implementsDemand(String demandName) { System.out.println("A Java Designer [ " + name + " ] implemented demand: {{ " + demandName + " }} in JAVA!"); } }
|
静态代理
1 2 3 4 5 6 7 8 9 10 11 12
| public class DesignerProxy implements IDesigner { private final IDesigner programmer;
public DesignerProxy(IDesigner programmer) { this.programmer = programmer; }
@Override public void implementsDemand(String demandName) { programmer.implementsDemand(demandName); } }
|
1 2 3 4 5 6 7
| public class Customer { public static void main(String[] args) { IDesigner designer = new JavaDesigner("cc"); IDesigner proxy = new DesignerProxy(designer); proxy.implementsDemand("Add User Management"); } }
|
动态代理
1 2 3 4 5 6 7 8 9 10 11 12
| public class DesignerDynamicProxy implements InvocationHandler { private final IDesigner designer;
public DesignerDynamicProxy(IDesigner designer) { this.designer = designer; }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(designer, args); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class Customer {
public static void main(String[] args) { IDesigner designer = new JavaDesigner("cc"); InvocationHandler handler = new DesignerDynamicProxy(designer); IDesigner proxy = (IDesigner) Proxy.newProxyInstance( designer.getClass().getClassLoader(), designer.getClass().getInterfaces(), handler); proxy.implementsDemand("Modify User Management"); }
}
|