设计模式(十三)之外观模式

发布时间:2019-07-26 09:19:59 阅读:53

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

     

    系统角色:

    1、外观角色(Facade)

    外观模式的核心,它被客户角色调用,它熟悉子系统的各项功能,可以在内部根据需求预定几种功能的组合;

    2、子系统角色(SubSystem)

    实现了子系统的功能,它内部可以有系统内的相互交互,也可以由供外界调用的接口。

     

    优点: 

    1.      减少系统相互依赖。

    2.      提高灵活性。

    3.      提高了安全性。

     

    缺点:

    1.      不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

    2.      没有办法直接阻止外部不通过外观类访问子系统的功能,因为子系统类中的功能必须是公开的(根据需要决定是否使用internal访问级别可解决这个缺点,但外观类需要和子系统类在同一个程序集内)。

     

    举个例子:我们使用的笔记本电脑实际上是把主机和显示屏的开关开关集合在一个按钮上,按下按钮开机的同时开启主机和显示屏。关机同理,下边我们使用外观模式来实现这个小例子。

    笔记本主机类:host.cs

    using System;
    namespace Facade
    {
        /// <summary>
        /// 主机类
        /// </summary>
        public class Host
        {
            public void HostOpen()
            {
                Console.WriteLine("主机开机中……");
            }
     
            public void HostClosed()
            {
                Console.WriteLine("主机关机中……");
            }
        }
    }

     

    显示屏类:display.cs

    using System;
    namespace Facade
    {
        /// <summary>
        /// 显示屏类
        /// </summary>
        public class Display
        {
            public void DisplayOpen()
            {
                Console.WriteLine("显示屏开机中……");
            }
     
            public void DisplayClosed()
            {
                Console.WriteLine("显示屏关机中……");
            }
        }
    }

     

    接口类:Interfaces.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace Facade
    {
        /// <summary>
        /// 接口类
        /// </summary>
        public class Interfaces
        {
            public Host host;
            public Display display;
     
            public Interfaces()
            {
                host = new Host();
                display = new Display();
            }
     
            /// <summary>
            /// 按钮集成关机功能
            /// </summary>
            public void Close()
            {
                host.HostClosed();
                display.DisplayClosed();
            }
     
            /// <summary>
            /// 按钮集成开机功能
            /// </summary>
            public void Open()
            {
                host.HostOpen();
                display.DisplayOpen();
            }
     
        }
    }

     

    客户端调用:program.cs

    using System;
    namespace Facade
    {
        /// <summary>
        /// 客户端调用
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                Interfaces inter = new Interfaces();
                Console.WriteLine("开机");
                inter.Open();
     
                Console.WriteLine("********************************************");
     
                Console.WriteLine("关机");
                inter.Close();
     
                Console.ReadLine();
            }
        }
    }

     

    输出效果如下图所示:

    121212.png

     

    使用场景:

    1.      在程序设计初期阶段,应该有意识的将不同的两个层分离。在层与层之间建立外观类。

    2.      在开发阶段,子系统往往因不断的重构演化而变得越来越复杂。这个时候,我们提供一个外观接口,减少他们之间的依赖。

    3.      维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了。为新系统开发一个外观类,来提供设计粗糙或高度复杂的遗留代码比较清晰简单的接口,让新系统与外观类对象交互。

     

    有好的建议,请在下方输入你的评论。

资源下载: