zoukankan      html  css  js  c++  java
  • 面向对象编程思想-外观模式

    一、引言

    每逢去吃午饭路上,几个同事都要讨论一番投资理财的事情,时间久之,小白的我才勉强了解到股票与基金的区别,股票是自身直接与某只股票交易,可以通过分红或者低买高卖获利(自身需要分析股市多只股票的行情,如图示一);而基金是把钱交给基金公司,有专业人员帮你分析股市或债券等帮你理财(自身不需要直接关注股市了,见图示二)。

                        图示一

                         图示二

    在软件开发中,客户端系统经常会与复杂系统的内部子系统进行耦合,从而导致客户端系统随着子系统的改变而改变,为了让客户端系统与复杂系统的内部子系统解耦,从而有了外观模式,也称作“门面模式”,下面将介绍我们今天学习的外观模式:

    二、外观模式的结构

    外观角色(Facade):被客户client调用,知道各个子系统的功能,根据客户的需要预订几种功能的组合

    子系统角色(subsystem):完成子系统功能,处理由facade对象分派的任务。对于子系统而言,facade和client角色是未知的

    客户角色(client):通过调用facade完成相应的功能

    三、外观模式

    定义:为子系统中的一组接口提供一个一致的界面,此模式定义一个高层接口,这个接口使得这一子系统更加容易使用

    介绍了外观模式的定义,下面我们通过两个例子的对比分析帮助理解外观模式,先看一下不使用外观模式时的投资理财demo

        //子系统  股票一
        class Subsystem1
        {
            public void Buy()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
            public void Sell()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
        }
        //子系统 股票二
        class Subsystem2
        {
            public void Buy()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
            public void Sell()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
        }
        //子系统 股票三
        class Subsystem3
        {
            public void Buy()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
            public void Sell()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
        }
          //客户端调用   
         class Program
        {
            //投资者需要清楚每只股票的行情 
            static void Main(string[] args)
            {
                Subsystem1 system1 = new Subsystem1();
                Subsystem2 system2 = new Subsystem2();
                Subsystem3 system3 = new Subsystem3();
                system1.Buy();
                system2.Buy();
                system3.Buy();
                system1.Sell();
                system2.Sell();
                system3.Sell();
                Console.Read();
            }
        }        
    View Code

    分析:从上面代码可以看出,投资者需要了解每只股票的行情,每次需要在复杂的股市中分析得出最优质的股票,然后投资理财

    下面看一下使用外观模式的投资理财demo

         //子系统 股票一
        class Subsystem1
        {
            public void Buy()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
            public void Sell()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
        }
        //子系统 股票二
        class Subsystem2
        {
            public void Buy()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
            public void Sell()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
        }
        //子系统 股票三
        class Subsystem3
        {
            public void Buy()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
            public void Sell()
            {
                Console.WriteLine(string.Format("执行{0}中的方法{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
        }
        //外观类  基金公司
        class FacadeSystem
        {
            Subsystem1 system1;
            Subsystem2 system2;
            Subsystem3 system3;
    
            public FacadeSystem()
            {
                system1 = new Subsystem1();
                system2 = new Subsystem2();
                system3 = new Subsystem3();
            }
            public void Buy()
            {
                system1.Buy();
                system2.Buy();
            }
            public void Sell()
            {
                system1.Sell();
            }
        }
        //客户端  投资基金, 基金公司 负责理财
         class Program
        {
            static void Main(string[] args)
            {
                FacadeSystem facade = new FacadeSystem();
                facade.Buy();
                facade.Sell();
                Console.Read();
            }
        }
    View Code

    分析:从上面代码可以看出,客户端只依赖外观类,投资者与股市之间的依赖关系解耦了,如果股市中某只股票行情改变,此时投资者并不需要改变。

    优点:

    1.外观模式对客户屏蔽子系统组件,简化了接口,减少了客户处理的对象数量并使子系统的使用更加容易

    2.外观模式实现子系统和客户之间的松耦合关系,而子系统内部之间可以是紧耦合的。松耦合使得子系统组件的变化不会影响到它的客户

    缺点:

    在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违反了“开闭原则”

    使用场景:

    1.为一个复杂系统提供简单接口时。使得子系统更具可重用性,更容易 对子系统定制

    2.引入facade将这个子系统与客户以及其它子系统分离,可以提高子系统的独立性和可移植性

    3.当需要构建一个层次结构的子系统时,使用facade定义每层的入口点。如果子系统之间是相互依赖的,可以让它们仅通过facade进行通讯,简化它们之间的依赖关系

    关于外观模式的学习就到此结束了,希望能够帮到你,若有不足,欢迎斧正,感谢您的阅读。

  • 相关阅读:
    python之+=与+(转载)
    python之上下文管理器与contextlib
    python之类中的super函数
    python之__dict__与dir(转载)
    python多继承之c3算法(转载)
    python之比较is与==(转载)
    python之鸭子类型
    python之抽象基类
    raindi python魔法函数(一)之__repr__与__str__
    Win7系统无法记住网络访问的凭据怎么办?
  • 原文地址:https://www.cnblogs.com/jdzhang/p/7202278.html
Copyright © 2011-2022 走看看