本帖最后由 创造命运 于 2014-4-25 17:39 编辑
上午看了张老师的代理视频。当我看到张老师介绍代理架构图时,我想起了装饰模式,感觉代理怎么跟装饰模式这么的像呢?
代理架构图如下:
于是我找出java设计模式的文档,一看才知道还有一个模式叫做代理模式。我将该模式的示例代码复制过来:
public interface Object {
void action();}
public class ProxyObject implements Object {
Object obj;
public ProxyObject() {
System.out.println("这是代理类");
obj = new ObjectImpl();
}
public void action() {
System.out.println("代理开始");
obj.action();
System.out.println("代理结束");
}
}
public class ObjectImpl implements Object {
public void action() {
System.out.println("========");
System.out.println("========");
System.out.println("这是被代理的类");
System.out.println("========");
System.out.println("========");
}
}
//测试代理类
public class Test {
public static void main() {
Object obj = new ProxyObject();
obj.action();
}
}
看完后一想,这不就是装饰模式吗?有一个接口Object,还有两个类(ProxyObject和ObjectImpl)都实现了接口Object,然后在ProxyObject类里拓展了ObjectImpl类的功能。
下面代码是一个装饰模式:
public interface Object {
void action();}
public class ProxyObject implements Object {
Objec obj = null;
public ProxyObject(Objec obj ) {
System.out.println("这是装饰类");
this.obj = obj;
}
public void action() {
System.out.println("装饰开始");
obj.action();
System.out.println("装饰结束");
}
}
public class ObjectImpl implements Object {
public void action() {
System.out.println("========");
System.out.println("========");
System.out.println("这是被装饰的类");
System.out.println("========");
System.out.println("========");
}
}
//测试装饰类
public class Test {
public static void main() {
//创建被装饰者
ObjectImpl objectImpl = new ObjectImpl();
//创建装饰者
ProxyObject proxyObject = new ProxyObject(objectImpl );
obj.action();
}
}
比较了一下,不同的地方就只是在装饰模式的装饰者的构造方法里接收了一个参数,这个参数是面向接口Object的。如果真是这么简单,那么用装饰模式不一样可以实现代理模式的功能了吗?为什么还要有一个代理模式呢?肯定没这么简单,于是在网上查找了一下两者的区别,找到这么一段话:装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。
怎么理解这段话呢?代理模式与装饰模式在用法上究竟又有哪些不同的地方呢?请教了,各位大神们!
|