设计模式之外观模式

外观模式定义

外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。

image-20210708213451497

外观模式实现

场景:小明最近入坑理财了,就去炒股票,由于是新手,对证券金融理财等都没有建立完善的体系,导致最后血亏。后来听朋友建议去买基金,基金是由众多支股票组合而成的,由专业的基金经理管理投资,相当于买了一揽子股票,最终小明只需要在合适的时机买入和卖出,而不用过多的去关心买啥股票,这里使用外观模式简单实现一下。

实现方式

  1. 考虑能否在现有子系统的基础上提供一个更简单的接口。 如果该接口能让客户端代码独立于众多子系统类。
  2. 在一个新的外观类中声明并实现该接口。 外观应将客户端代码的调用重定向到子系统中的相应对象处。 如果客户端代码没有对子系统进行初始化, 也没有对其后续生命周期进行管理, 那么外观必须完成此类工作。
  3. 如果要充分发挥这一模式的优势, 你必须确保所有客户端代码仅通过外观来与子系统进行交互。 此后客户端代码将不会受到任何由子系统代码修改而造成的影响, 比如子系统升级后, 你只需修改外观中的代码即可。
  4. 如果外观变得过于臃肿, 你可以考虑将其部分行为抽取为一个新的专用外观类。

伪代码示例

首先创建一些股票

public class Stock1 : BaseStock
    {
        public override void Buy()
        {
            Console.WriteLine("买入股票1");
        }

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

创建基类类

 public class Fund
    {
        private Stock1 stock1;
        private Stock2 stock2;
        private Stock3 stock3;

        public Fund()
        {
            stock1 = new Stock1();
            stock2 = new Stock2();
            stock3 = new Stock3();
        }

        public void BuyFund()
        {
            stock1.Buy();
            stock2.Buy();
            stock3.Buy();
        }

        public void SellFund()
        {
            stock1.Sell();
            stock2.Sell();
            stock3.Sell();
        }
    }

写的比较粗糙,主要就是简单去模拟基金经理买入和赎回股票

接着客户端调用,购买基金

static void Main(string[] args)
        {
            Fund fund = new Fund();
            fund.BuyFund();
            fund.SellFund();

            Console.WriteLine("Press Any Key to end!");
            Console.ReadKey();
        }

外观模式优缺点

优点

  • 可以让自己的代码独立于复杂子系统。

缺点

  • 外观可能成为与程序中所有类都耦合的上帝对象

外观模式使用场景

  • 如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限,则可以使用外观模式。
  • 如果需要将子系统组织为多层结构,可以使用外观。

示例源代码

源代码地址:https://github.com/luchong0813/DesignModel

原文地址:https://www.cnblogs.com/chonglu/p/14988297.html