牛市股票还会亏钱?—外观模式

继上一篇“无熟人难办事?—迪米特法则”后,本文继续讲解《大话设计模式》第12章“牛市股票还会亏钱?—外观模式”。喜欢本书请到各大商城购买原书,支持正版。

大话设计模式前期读书系列:

本文正式开始前,站长提示

股市有风险,投资需谨慎!本文只是一个虚拟的故事,另投资一定要用自己的闲钱,万不可贷款炒股,切记切记。

本文正式开始


1 牛市股票还会亏钱?

时间:4月9日19点 地点:小菜大鸟住所的客厅 人物:小菜、大鸟

“大鸟,你炒股票吗?”小菜问道。

“炒过,那是好几年前了,可惜碰到熊市,亏得一塌糊涂。”大鸟坦诚地回答,“你怎么会问起股票来了?”

“我们公司的人现在都在炒股票,其实大部人都不太懂,就是因为现在股市行情很火,于是都在跟风呢!”

“那他们做得如何?”

“有一个好像还可以,赚了不少钱,具体不太清楚,但另外几个人都是刚入市的,什么都不懂,特别是一个叫顾韵梅的同事,她说得蛮搞笑的,‘今天看好了一只快涨停的股票,买进去,第二天马上就跌了。明天再去换另一只好的股票,几天都不涨,等一卖出,马上就涨停。’于是乎,在大好的牛市行情里,,她却连连亏损,天天在我们面前抱怨呀。”

“哈,典型的新股民特征嘛。其实不会炒股票的话,买一只好股票放在那里所谓的‘悟股’是最好的做股票策略了。”

“自己的钱买了股票,天天都在变化,谁能不关心,特别是刚开始,都希望能涨涨涨。尽管不现实,不过赚钱的人还是有的是。不过一打开股票软件,一千多只股票,红红绿绿,又是指数大盘,又是个股K线指标,一下说基本面如何如何重要,一下又说什么有题材才可以赚大钱,头晕眼花,迷茫困惑呀。”

“小菜是不是也在做股票了﹖刚才提到的顾韵梅的经历,不会是说你自己的吧?”大鸟笑言道。

“哈,是真人真事,不是我。不过我也有点动心,但不知道如何炒,所以最近也下了一个软件,并小研究了一下。发现很复杂呀。”

“就算是你,也没什么不好意思的。其实股民,特别是新股民在没有足够了解证券知识的情况下去做股票,是很容易亏钱的。毕竟,需要学习的知识实在太多了,不具备这些知识就很难做好,再有就是心态也非常重要,刚开始接触股票的人一般都盼涨怕跌,于是心态很不稳定,这反而做不好股票。听说现在心理医生问病人的第一句话就是,‘你炒股票吗?’”

“要是有懂行的人帮帮忙就好了。”

“哈,基金就是你的帮手呀。它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有投资者所有,管理机构收取一定比例的托管管理费用。想想看,这样做有什么好处?”

“我感觉,由于基金会买几十支好的股票,不会因为某个股票的大跌而影响收益,尽管每个人的钱不多,但大家放在一起,反而容易达到好的投资效果。”

“说得不错,那如果是你自己做股票,为什么风险反而大了?”

“因为我需要了解股票的各种信息,需要预测它的未来,还要买入和卖出的时机合适,这其实是很难做到的。专业的基金经理人相对专业,所以就不容易像散户那么盲目。”

“尽管我们在谈股票,我还是想问问你,投资者买股票,做不好的原因和软件开发当中的什么类似?而投资者买基金,基金经理人用这些钱去做投资,然后大家获利,这其实又体现了什么?”

“我知道了,你的意思是说,由于众多投资者对众多股票的联系太多,反而不利于操作,这在软件中是不是就称为耦合性过高。而有了基金以后,变成众多用户只和基金打交道,关心基金的上涨和下跌就可以了,而实际上的操作却是基金经理人在与上千支股票和其他投资产品打交道。”

“小菜越来越不简单了嘛,这段话说得非常好,由于投资者要面对这么多的股票,又不专业,所以很难做好,但要投资者买一支好的基金,这应该是不难的,说白了,投资的目的还不是为了赚钱,那干吗不稳妥一些呢?这里其实提到了一个在面向对象开发当中用得非常多的一个设计模式——外观模式,又叫门面模式。不过为了讲清楚它,你先试着把股民炒股票的代码写写看。”

“这有何难。”

2 股民炒股代码

小菜写出股民投资的炒股版

牛市股票还会亏钱?—外观模式
代码结构图

具体股票、国债、房产类

// 股票1
class Stock1
{
  // 卖股票
  public void Sell()
  {
    Console.WriteLine("股票1卖出");
  }

  // 买股票
  public void Buy()
  {
    Console.WriteLine("股票1买入");
  }
}

// 股票⒉
class Stock2
{
  // 代码类似股票1略
}

// 股票3
class Stock3
{
  // 代码类似股票1略
}

// 国债1
class NationalDebt1
{
  // 代码类似股票1略
}

// 房地产1
class Realty1
{
  //代码类似股票1略
}

客户端调用

static void Main(string[] args)
{
  Stock1 qu1 = new Stock1();
  Stock2 qu2 = new Stock2();
  Stock3 qu3 = new Stock3();
  NationalDebt1 nd1 = new NationalDebt1();
  Realty1 rt1 = new Realty1();

  // 用户需要了解股票、国债、房产情况,需要参与这些项目的具体买和卖。耦合性很高
  qu1.Buy();
  qu2.Buy();
  qu3.Buy();
  nd1.Buy();
  rt1.Buy();

  qu1.Sell();
  qu2.Sell();
  qu3.Sell();
  nd1.Sell();
  rt1.Sell();

  Console.Read();
}

3 投资基金代码

“很好,如果我们现在增加基金类,将如何做?”

“那就应该是这个样子了。”

小菜写出股民投资的基金版

牛市股票还会亏钱?—外观模式
代码结构图

基金类如下

/// <summary>
/// 基金类,它需要了解所有的股票或其他投资方式的方法或属性,进行组合,以备外界调用
/// </summary>
class Fund
{
  Stock1 qu1;
  Stock2 qu2;
  Stock3 qu3;
  NationalDebt1 nd1;
  Realty1 rt1;

  public Fund()
  {
    Stock1 qu1 = new Stock1();
    Stock2 qu2 = new Stock2();
    Stock3 qu3 = new Stock3();
    NationalDebt1 nd1 = new NationalDebt1();
    Realty1 rt1 = new Realty1();
  }

  public void BuyFund()
  {
    qu1.Buy();
    qu2.Buy();
    qu3.Buy();
    nd1.Buy();
    rt1.Buy();
  }

  public void SellFund()
  {
    qu1.Sell();
    qu2.Sell();
    qu3.Sell();
    nd1.Sell();
    rt1.Sell();
  }
}

客户端如下

static void Main(string[] args)
{
  // 此时用户不需要了解股票,甚至可以对股票一无所知,买了基金就回家睡觉,
  // 一段时间后再赎回就可以大把数钱。参与股票的具体买卖都由基金公司完成。
  // 客户端代码非常简捷明了
  Fund jiJin = new Fund();

  // 基金购买
  jiJin.BuyFund();

  // 基金赎回
  jiJin.SellFund();

  Console.Read();
}

“很好很好,你这样的写法,基本就是外观模式的基本代码结构了。现在我们来看看什么叫外观模式吧。”

4 外观模式

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。[DP]

牛市股票还会亏钱?—外观模式
外观模式结构图

四个子系统的类

class SubSystemOne
{
  public void MethodOne()
  {
    Console.WriteLine("子系统方法一");
  }
}

class SubSystemTwo
{
  public void MethodTwo()
  {
    Console.WriteLine("子系统方法二");
  }
}

class SubSystemThree
{
  public void MethodThree()
  {
    Console.WriteLine("子系统方法三");
  }
}

class SubSystemFour
{
  public void MethodFour()
  {
    Console.WriteLine("子系统方法四");
  }
}

外观类

/// <summary>
/// 外观类,它需要了解所有的子系统的方法或属性,进行组合,以备外界调用
/// </summary>
class Facade
{
  SubSystemOne one;
  SubSystemTwo two;
  SubSystemThree three;
  SubSystemFour four;

  public Facade()
  {
    one = new SubSystemOne();
    two = new SubSystemTwo();
    three = new SubSystemThree();
    four = new SubSystemFour();
  }

  public void MethodA()
  {
    Console.WriteLine("\n方法组A()---- ");
    one.MethodOne();
    two.MethodTwo();
    four.MethodFour();
  }

  public void MethodB()
  {
    Console.WriteLine("\n方法组B()---- ");
    two.MethodTwo();
    three.MethodThree();
  }
}

客户端调用

static void Main(string[] args)
{
  // 由于Facade的作用,客户端可以根本不知三个子系统类的存在
  Facade facade = new Facade();

  facade.MethodA();
  facade.MethodB();

  Console.Read();
}

“对于面向对象有一定基础的朋友,即使没有听说过外观模式,也完全有可能在很多时候使用它,因为它完美地体现了依赖倒转原则和迪米特法则的思想,所以是非常常用的模式之一。”

5 何时使用外观模式

“那外观模式在什么时候使用最好呢?”小菜问道。

“这要分三个阶段来说,首先,在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须要依赖于它。此时用外观模式Facade也是非常合适的。你可以为新系统开发一个外观 Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。[R2P]

牛市股票还会亏钱?—外观模式

“嗯,对的,对于复杂难以维护的老系统,直接去改或去扩展都可能产生很多问题,分两个小组,一个开发Facade与老系统的交互,另一个只要了解Facade的接口,直接开发新系统调用这些接口即可,确实可以减少很多不必要的麻烦。”

“OK,我明白了,明天把股票卖了,改去买基金。”小菜感觉找到了方向。

“哈,小菜呀小菜,该不是你自己炒股票亏钱了吧?”大鸟微笑地看着小菜。

“嘿嘿,”小菜脸通红,“我当然也是参与了一点点。谁叫你不教我外观模式,害得我好容易攒了点钱却白白亏了不少。”

“啊,赖我呀?”大鸟一脸无辜。


下一篇我们接着读“第13章 好菜每回味不同—建造者模式”,欢迎关注微信公众号【乐趣课堂】。

原文出处:微信公众号【爱读书 乐趣课堂】

原文链接:https://mp.weixin.qq.com/s/CBfMnxZQ7yGV8Xhk4h1PiQ

本文观点不代表Dotnet9立场,转载请联系原作者。

发表评论

登录后才能评论