设计模式之代理(利用间接通信改善系统设计的模式)

代理模式(利用间接通信改善系统设计的模式):
    代理模式给某一对象提供一个代理对象,并由代理对象控制对原对象的引用。
    间接性的通信可以给出较低的耦合关系,较强的合作关系,以及微妙的结构和易于复用的设计架构。
    所谓代理(proxy or surrogate),就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
如果按照使用目的来划分,代理有以下几种:
远程(Remote)代理:
虚拟(Virtual)代理:
Copy-on-Write 代理:
保护(Protect or Access)代理:
Cache 代理:
防火墙(firewall)代理:
同步化(Synchronization)代理:
智能引用(Smart Reference)代理:
代理模式所涉及的角色有:
抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以使用代理主题。
代理主题角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象,代理主题角色内部含有对真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题。
真实主题角色:代理角色所代表的真实对象。
代理模式是怎样工作的:
首先,代理主题并不改变主题的接口,因为模式的用意是不让客户端感觉到代理的存在。
其次,代理使用委派将客户端的调用委派给真实的主题对象,换言之,代理主题起到的是一个传递请求的作用。
最后,代理主题在传递请求这前和之后都可以执行特定的操作,而不是单纯传递请求。
代理模式将一个中间层插入到客户端和主题角色之间,从而提供了许多的灵活性。

Java 语言通过 java.lang.reflect 库中提供了三个类直接支持代理模式:Proxy 、InvocationHandler 和 Method 。其中 Proxy 类使得设计师能够在运行时间创建代理对象。
设计师创建动态代理的步骤:
1。指明一系列的接口来创建一个代理对象。
2。创建一个调用处理器(Invocation Handler)对象。
3。将这个代理指定为某个其他对象的代理对象。
4。在调用处理器的 invoke() 方法中采用代理,一方面将调用传递给真实对象,另一方面执行各种需要做的操作。


代理模式与其它模式的关系:
适配器模式:适配器模式的用意是要改变所考虑的对象的接口,而代理模式并不能改变所代理的对象的接口,在这一点上两个模式有明显的区别。
装饰模式:装饰模式应当为所装饰的对象提供增强功能;而代理模式对对象的使用施加控制,并不提供对象本身的增强功能。
门面模式:有时候,门面模式兼任代理的责任,这种时候的门面模式又叫代理门面模式,或门面代理模式。

不同种类的代理:
远程代理:
优点是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。缺点是由于客户可能没有意识到会启动一个耗费时间的远程调用,因此,客户没有必要的思想准备。
虚拟代理:
优点是代理对象可以在必要的时候才将被代理的对象加载。代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的时候,虚拟代理的优点就非常明显。
当一个真实主题对象的加载需要耗费资源时,一个虚拟代理对象可以代替真实对象接受请求。一旦接到请求,代理对象马上打出一段 "正在加载" 的信息,并在适当的时候加载真实主题对象,也就是模块等资源。
保护代理:
优点是它可以在运行时间对用户的有关权限进行检查,在核实后决定是否将调用传递给被代理的对象。
智能引用代理:
在访问一个对象时可以执行一些内务(Housekeeping)处理操作,如计数操作等。

有经验的设计师不会仅仅给出一个具体类就交差,因为设计师必须考虑到查询功能在今后可能会有的变化。因此,一个好的设计必须使系统可以在最小的改动下进行最大的扩充。
代理模式的用意之一,要针对抽象编程,不要针对具体编程。


SwingUtilities.invokeLater() 方法会开启一个独立的新线程,用以执行一个新的任务(异步执行)。SwingUtilities.invokeAndWait() 方法与前者不同的是,它会将主线程的执行封锁住,直到新线程的任务完成为止(同步执行)。

你可能感兴趣的:(设计模式,编程,cache,防火墙,Access)