門面模式

不該相遇在秋天發表於2019-05-05

老王的股票

  大家好,我是小趙,目前任職藏劍山莊高階鑄劍師,在山莊裡和我玩的比較好的有老王和老劉他們幾個,都是組長級別的二貨們,經常混在一起打牌。

  今天上午閒得蛋疼晃悠晃悠的晃到的老王的地盤,看到老王在埋頭寫程式:

    public static void main(String[] args) {
        Stock1 stock1 = new Stock1();
        stock1.buy();

        Stock2 stock2 = new Stock2();
        stock2.sell();

        Stock3 stock3 = new Stock3();
        stock3.buy();

        //省略八百行差不多的程式碼.....
    }

  這老王似乎在炒股票,好專業的樣子。

  於是我伸手拍了拍老王的肩膀:“幹啥呢?”。

  老王一下子打了個哆嗦,回頭看到是我,才鬆了一口氣,說道:“搞毛線,今天的情況有點複雜,我這些股票感覺要死一大片,得抓緊時間調整戰術”。

 

  我仔細看了一下老王的程式:

股票1:

public class Stock1 {
    public void sell(){
        System.out.println("賣出股票1");
    }
    public void buy(){
        System.out.println("買入股票1");
    }
}

股票2:

public class Stock2 {
    public void sell(){
        System.out.println("賣出股票2");
    }
    public void buy(){
        System.out.println("買入股票2");
    }
}

股票3:

public class Stock3 {
    public void sell(){
        System.out.println("賣出股票3");
    }
    public void buy(){
        System.out.println("買入股票3");
    }
}

省略其他股票。。。。。

 

  看到這裡,我腦海中立刻浮現出一張縮圖:

  “我草!,老王,你牛逼啊,這麼多股票,你一個一個操作,得搞死多少腦細胞啊?小心精盡人亡。”

  “老趙,你有好辦法?”

 

馬爸爸的餘額寶

  下班後,老王來我家裡取經,我給他看了個產品,餘額寶:

public class YuEBao {
    public void in(){
        System.out.println("存錢");
    }

    public void select(){
        System.out.println("查詢餘額");
    }

    public void out(){
        System.out.println("取錢");
    }

    private void execute(){
        Stock1 stock1 = new Stock1();
        stock1.buy();

        Stock2 stock2 = new Stock2();
        stock2.sell();

        Stock3 stock3 = new Stock3();
        stock3.buy();
    }
}

  “老趙,你這玩意兒怎麼用?”

  “這個叫餘額寶,我只需要往裡存錢,然後就每天收錢就行,啥都不需要管,至於操作各種股票的execute方法由余額寶自己去搞,人家有一批專業的投資專家團隊幫你操作資金”

  “這樣我就不用自己去直接操作幾十只股票了?”

  “是的,只是如果賺的話可能沒你自己操作賺的多,但是非常穩定。市場上還有很多基金也是一樣的道理,都是封裝了各種股票操作的細節,只給我們提供最簡單的投入、取現等大眾化介面。”

用圖來表達就是這樣子:

門面模式

  門面模式(Facade Pattern),也叫做外觀模式,為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。

  餘額寶這個類,其實就是一個門面 Facade,它封裝了子系統操作各種股票的邏輯,減少了外部系統與內部系統的依賴,使得所有依賴都是針對門面物件,無論子系統中的股票如何變化,都不影響到外部系統。

 

  當然,如果程式碼表現出的門面模式引起了你的爭議,那麼你也可以這麼寫:

public class YuEBao {
    public void stock1Buy(){
        Stock1 stock1 = new Stock1();
        stock1.buy();
    }
    public void stock1Sell(){
        Stock1 stock1 = new Stock1();
        stock1.sell();
    }
    public void stock2Buy(){
        Stock2 stock2 = new Stock2();
        stock2.buy();
    }
    public void stock1Sel2(){
        Stock2 stock2 = new Stock2();
        stock2.sell();
    }
    public void stock3Buy(){
        Stock3 stock3 = new Stock3();
        stock3.buy();
    }
    public void stock1Sel3(){
        Stock3 stock3 = new Stock3();
        stock3.sell();
    }
}

  門面模式是一種常用的封裝方式,可能大家在開發中會經常使用到,實際上,門面物件中並沒有什麼實際的業務邏輯,它只是一個委託類。

相關文章