通过学习了这两种模式,我发现这两种模式虽然在使用和理解上有一些差异,不过也有很多相同之处,故而将这两个模式放在同一篇文章中来记录我看到的内容。
首先来看看两种模式的解释:
1、装饰模式:对一个类进行装饰,对这个原始类进行扩展,需要新增一个装饰类对原始类进行装饰。
2、代理模式:对一个类进行封装,并不对外直接暴露,而是通过一个代理类,替代直接对原始类的操作。
个人理解的差异就是:装饰类,用户是知道我需要装饰的类是哪个,对用户是透明的;而代理类,直接就不给用户知道,用户知道的只是该类的一个代理类,对原始类的本身没有一个知情权。这一点差异,就是我理解的这两个模式的本质上的差异点。
通过这样的差异,我们通过代码来看一下这两个模式之间不一样的地方。
相同点,装饰类和被装饰类都需要实现同一个接口。代理类和被代理类也需要实现同一个接口
首先,老办法,写出两个都需要的部分:
ISource.java
package com;
public interface ISource {
public void method();
}
原始类:Source.java
package com;
public class Source implements ISource {
@Override
public void method() {
System.out.println("This is method from source Class");
}
}
装饰模式,我要知道需要装饰的是什么对象,因此是这样写的。
Decorator.java
package com;
public class Decorator implements ISource {
private Source source;
public Decorator(Source source) {
// TODO Auto-generated constructor stub
this.source = source;
}
@Override
public void method() {
// TODO Auto-generated method stub
System.out.println("before decorator!");
source.method();
System.out.println("after decorator!");
}
}
测试类:
DecoratorTest.java
package com;
public class DecoratorTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Source source = new Source();
Decorator decorator = new Decorator(source);
decorator.method();
}
}
二、代理模式
代理模式,完全隐藏了原始类的信息,暴露给外面的只有这个代理
Proxy.java
package com;
public class Proxy implements ISource {
ISource source;
public Proxy() {
// TODO Auto-generated constructor stub
this.source = new Source();
}
@Override
public void method() {
// TODO Auto-generated method stub
importData();
source.method();
calcResult();
}
private void calcResult() {
// TODO Auto-generated method stub
System.out.println("This is import Data");
}
private void importData() {
// TODO Auto-generated method stub
System.out.println("This is clac result");
}
}
测试类:
ProxyTest.java
package com;
public class ProxyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ISource proxy = new Proxy();
proxy.method();
}
}
结论:
在代码结果上,两个模式非常类似,仅仅是装饰者模式需要装饰者需要持有原始类的对象,而代理模式是在代理模式中自己new了一个原始类的对象出来。从代码上看很类似
。但是要理解其中概念和理念上的差距。
装饰模式:对原由的类进行装饰,新增或者修改一些具体实现。
代理模式:仅仅是将原有的类进行封装,只抛出一个代理,来处理原有的类,并没有对原来的类进行任何修改。
其实我的理解也不是很深,而且也不一定描述的完整和正确,请各位大神指正,谢谢~