对象去耦(object decoupling)
代理(proxy)模式与状态(state)模式分别提供了供你使用的代理类(surrogate class);正真干活的那个类被代理类隐藏了.当你调用代理类的一个方法的时候,代理类只是简单的调用实现类(implementing class)所对应的方法.这两种模式非常相似,实际上,代理(proxy)模式只是状态(state)模式的一个特例. 【程序编程相关:介绍J2ME中的通用联网框架】
【推荐阅读:使用java.text包格式化数字和日期】
这两种模式的基本概念非常简单:代理类 (surrogate) 与 实现类都由同一个基类派生出来: 【扩展信息:[原创]将OLE StdFont字体结构】
有人试图将这两种模式合在一起统称为surrogate模式,但是“代理(proxy)”这个术语已经用了很长时间了,而且它有自己特殊的含义,它的这些含义基本上体现了这两种模式的差别所在.
当创建一个代理对象 (surrogate object) 时,同时会创建一个实现(对象),代理对象会把所有的方法调用传递给实现对象.
从结构上看,代理(proxy)模式与状态(state)模式之间的差别非常简单:一个代理(proxy)只对应一个实现(implementation),而一个状态(state)却可以对应多个实现.«设计模式»一书认为,这两种两种模式的应用场合是截然不同的:代理(proxy)模式用于控制对实现(类)的访问,而状态(state)模式可以动态地改变实现(类).但是,如果把“控制对实现类的访问”这个概念扩展开来的话,这两种模式就可以优雅的结合在一起了.
代理:替另外一个对象打点一切(proxy: fronting for another object)
我们按照上面的图示实现代理(proxy)模式,下面是实现代码:
//: proxy:proxydemo.java
// simple demonstration of the proxy pattern.
package proxy;
import junit.framework.*;
interface proxybase {
void f();
void g();
void h();
}
class proxy implements proxybase {
private proxybase implementation;
public proxy() {
implementation = new implementation();
}
// pass method calls to the implementation:
public void f() { implementation.f(); }
public void g() { implementation.g(); }
public void h() { implementation.h(); }
}
class implementation implements proxybase {
public void f() {
system.out.println("implementation.f()");
}
public void g() {
system.out.println("implementation.g()");
}
public void h() {
system.out.println("implementation.h()");
}
}
public class proxydemo extends testcase {
proxy p = new proxy();
public void test() {
// this just makes sure it will complete
// without throwing an exception.
p.f();
p.g();
p.h();
}
public static void main(string args[]) {
junit.textui.testrunner.run(proxydemo.class);
}
} ///:~
当然,并不是说实现类与代理类必须实现完全相同的接口;既然代理类只是在一定程度上代表那个需要它提交(referring)方法的类,这就已经满足了proxy模式的基本要求(注意这里的陈述与gof一书所给出的定义是有差别的).... 下一页