zoukankan      html  css  js  c++  java
  • 设计模式之外观模式

    外观模式定义

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

    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

  • 相关阅读:
    SQL去除重复记录
    FullCalendar应用——整合农历节气和节日
    Dropzone.js实现文件拖拽上传
    HTML5实现文件断点续传
    FullCalendar日历插件说明文档
    网络电影免会员播放器
    百度网盘搜索工具
    HTML5学习
    HTML2 -- 布局格式
    JS10 -- url问号后的数据
  • 原文地址:https://www.cnblogs.com/chonglu/p/14988297.html
Copyright © 2011-2022 走看看