老王的股票
大家好,我是小趙,目前任職藏劍山莊高階鑄劍師,在山莊裡和我玩的比較好的有老王和老劉他們幾個,都是組長級別的二貨們,經常混在一起打牌。
今天上午閒得蛋疼晃悠晃悠的晃到的老王的地盤,看到老王在埋頭寫程式:
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(); } }
門面模式是一種常用的封裝方式,可能大家在開發中會經常使用到,實際上,門面物件中並沒有什麼實際的業務邏輯,它只是一個委託類。