废话不多说,直接上代码:
public interface Sourceable {
public void method(); }public class Source implements Sourceable {
@Override public void method() { System.out.println("I am the source"); } }这里是一个代理类:
public class Proxy implements Sourceable {
private Source source; public Proxy(){ super(); this.source = new Source(); } @Override public void method() { before(); source.method(); atfer(); } private void atfer() { System.out.println("after proxy!"); } private void before() { System.out.println("before proxy!"); } }这里是一个装饰类:
public class Decorator implements Sourceable {
private Sourceable source;
public Decorator(Sourceable source){ super(); this.source = source; }
@Override public void method() { System.out.println("before decorator!"); source.method(); System.out.println("after decorator!"); }public static void main(String[] args) {
Sourceable source = new Source(); Sourceable obj = new Decorator(source); obj.method(); } }这两个类,乍一看,好像差不多啊,实现的功能也差不多。
如果说有什么不一样的地方,无非就是构造函数的时候,一种是自己生成了一个(代理),一种是传进来一个。
我们该怎么理解这样的不同呢?或者说2种模式分别是用于什么样的场景?
语义,我们还是从语义的层面上,来理解这个问题。
笔者最近正在卖房,就拿这个举例吧,我有套房,要卖,可是本身我事情比较多,或者我在外地,那么我可以去公证处做个公正,让另外一个人全权代理我在卖房过程中的各种事情。那么对于买家而言,他是见不到我的,他见到的只是我的代理人。这就是代理。
那么装饰呢,可以这么理解,我要卖房,可是我没啥经验,所以我找了个明白人,在卖房的过程中,一直陪着我,过程中给我出谋划策,让我在这个过程当中规避掉一些风险。这就是装饰。
那么具体到代码上,什么时候用装饰,什么时候用代理,简单地说,如果你的被代理对象是不方便出面的,那就用代理,如果你不介意让别人知道他是谁,那就用装饰者。
设计模式,按照我的理解,它的命名和使用,一方面当然是你的代码结构更加优雅,具有更好的可扩展性,还有一方面也是很重要的原因,便于其他人的理解,换句话说,我们可以把设计模式,当做,面向对象世界当中的一组高级的、通用的原语,在大家对设计模式都有了充分的理解的基础上,大家对一组词汇,应该是有着差不多的理解。
如果大家对一些开源的源码有一定了解的话,会发现,如果你对设计模式有了一些了解,那么在你读源码的过程当中,会变得轻松很多,因为这个相当于,人家要说啥,你很容易就明白了!