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種模式分別是用於什麼樣的場景?

語義,咱們仍是從語義的層面上,來理解這個問題。

筆者最近正在賣房,就拿這個舉例吧,我有套房,要賣,但是自己我事情比較多,或者我在外地,那麼我能夠去公證處作個公正,讓另一我的全權代理我在賣房過程當中的各類事情。那麼對於買家而言,他是見不到個人,他見到的只是個人代理人。這就是代理。

那麼裝飾呢,能夠這麼理解,我要賣房,但是我沒啥經驗,因此我找了個明白人,在賣房的過程當中,一直陪着我,過程當中給我出謀劃策,讓我在這個過程中規避掉一些風險。這就是裝飾。

那麼具體到代碼上,何時用裝飾,何時用代理,簡單地說,若是你的被代理對象是不方便出面的,那就用代理,若是你不介意讓別人知道他是誰,那就用裝飾者。

設計模式,按照個人理解,它的命名和使用,一方面固然是你的代碼結構更加優雅,具備更好的可擴展性,還有一方面也是很重要的緣由,便於其餘人的理解,換句話說,咱們能夠把設計模式,當作,面向對象世界當中的一組高級的、通用的原語,在你們對設計模式都有了充分的理解的基礎上,你們對一組詞彙,應該是有着差很少的理解。

若是你們對一些開源的源碼有必定了解的話,會發現,若是你對設計模式有了一些瞭解,那麼在你讀源碼的過程中,會變得輕鬆不少,由於這個至關於,人家要說啥,你很容易就明白了!

相關文章
相關標籤/搜索