门面模式
老王的股票
大家好,我是小赵,目前任职藏剑山庄高级铸剑师,在山庄里和我玩的比较好的有老王和老刘他们几个,都是组长级别的二货们,经常混在一起打牌。
今天上午闲得蛋疼晃悠晃悠的晃到的老王的地盘,看到老王在埋头写程序:
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(); } }
门面模式是一种常用的封装方式,可能大家在开发中会经常使用到,实际上,门面对象中并没有什么实际的业务逻辑,它只是一个委托类。