java 设计模式 (代理模式和装饰者模式的区别)

废话很少说,直接上代码:设计模式

public interface Sourceable {
    public void method();
}ide

public class Source implements Sourceable {
    @Override
    public void method() {
        System.out.println("I am the source");
    }
}函数

这里是一个代理类:this

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!");
    }
}spa

这里是一个装饰类:设计

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();
    }
}class

这两个类,乍一看,好像差很少啊,实现的功能也差很少。

若是说有什么不同的地方,无非就是构造函数的时候,一种是本身生成了一个(代理),一种是传进来一个。

咱们该怎么理解这样的不一样呢?或者说2种模式分别是用于什么样的场景?

语义,咱们仍是从语义的层面上,来理解这个问题。

笔者最近正在卖房,就拿这个举例吧,我有套房,要卖,但是自己我事情比较多,或者我在外地,那么我能够去公证处作个公正,让另一我的全权代理我在卖房过程当中的各类事情。那么对于买家而言,他是见不到个人,他见到的只是个人代理人。这就是代理。

那么装饰呢,能够这么理解,我要卖房,但是我没啥经验,因此我找了个明白人,在卖房的过程当中,一直陪着我,过程当中给我出谋划策,让我在这个过程中规避掉一些风险。这就是装饰。

那么具体到代码上,何时用装饰,何时用代理,简单地说,若是你的被代理对象是不方便出面的,那就用代理,若是你不介意让别人知道他是谁,那就用装饰者。

设计模式,按照个人理解,它的命名和使用,一方面固然是你的代码结构更加优雅,具备更好的可扩展性,还有一方面也是很重要的缘由,便于其余人的理解,换句话说,咱们能够把设计模式,当作,面向对象世界当中的一组高级的、通用的原语,在你们对设计模式都有了充分的理解的基础上,你们对一组词汇,应该是有着差很少的理解。

若是你们对一些开源的源码有必定了解的话,会发现,若是你对设计模式有了一些了解,那么在你读源码的过程中,会变得轻松不少,由于这个至关于,人家要说啥,你很容易就明白了!

相关文章
相关标签/搜索