老王的股票

  大家好,我是小赵,目前任职藏剑山庄高级铸剑师,在山庄里和我玩的比较好的有老王和老刘他们几个,都是组长级别的二货们,经常混在一起打牌。

  今天上午闲得蛋疼晃悠晃悠的晃到的老王的地盘,看到老王在埋头写程序:

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

省略其他股票。。。。。

  看到这里,我脑海中立刻浮现出一张缩略图:

门面模式-LMLPHP

  “我草!,老王,你牛逼啊,这么多股票,你一个一个操作,得搞死多少脑细胞啊?小心精尽人亡。”

  “老赵,你有好办法?”

马爸爸的余额宝

  下班后,老王来我家里取经,我给他看了个产品,余额宝:

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方法由余额宝自己去搞,人家有一批专业的投资专家团队帮你操作资金”

  “这样我就不用自己去直接操作几十只股票了?”

  “是的,只是如果赚的话可能没你自己操作赚的多,但是非常稳定。市场上还有很多基金也是一样的道理,都是封装了各种股票操作的细节,只给我们提供最简单的投入、取现等大众化接口。”

用图来表达就是这样子:

门面模式-LMLPHP

门面模式

  门面模式(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();
    }
}

  门面模式是一种常用的封装方式,可能大家在开发中会经常使用到,实际上,门面对象中并没有什么实际的业务逻辑,它只是一个委托类。

05-06 01:12