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

    设计模式之外观模式

    一、引言

      当一个复杂的系统由多个复杂的子系统构成,然后客户端调用会调用多个子系统。这时,客户端会和多个子系统耦合在一起,当子系统需要扩展或者改变时,客户端也要随之改变,我们可以使用外观模式将客户端和子系统进行解耦。

    二、介绍 

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

    主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。

    何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统的入口。

    如何解决:客户端不与系统耦合,外观类与系统耦合。

    关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。

    应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。 2、JAVA 的三层开发模式。

    优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。

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

    使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。

    注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。

    三、图解 

     

     

     

    四、代码展示

     代码简介: 复杂的电脑系统包括三个子系统:CPU系统,风扇系统,显示器系统。 每次用户去使用电脑的时候不可能让用户单独去打开CPU的开关,风扇的开关和显示器的开关,我们使用外观模式,提供了一个更高级的接口,即Computer类型,computer中有这三个子系统,用户只需打开电脑的开关运行电脑就可以了。

    namespace Facade
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Console.WriteLine("Hello World!");
    
                Computer c = new Computer();
                c.StartWork();
            }
        }
    }
    主程序
    namespace Facade
    {
        public class Computer
        {
            public CPU cpu = new CPU();
            public FengShan fengShan = new FengShan();
            public Display display = new Display();
    
            public void StartWork() {
    
                if (cpu.StartWork())
                {
                    if (fengShan.StartWork())
                    {
                        if (display.StartWork())
                        {
                            Console.WriteLine("电脑开始工作。。。");
                            Console.ReadKey();
                        }
                        else
                        {
                            Console.WriteLine("显示器启动失败");
                        }
                    }
                    else
                    {
                        Console.WriteLine("风扇启动失败");
                    }
                }
                else
                {
                    Console.WriteLine("CPU启动失败");
                }
            }
        }
    }
    Computer
    namespace Facade
    {
        public  class CPU
        {
            public bool StartWork() {
                Console.WriteLine("Cpu开始工作。。。");
                return true;
            }
        }
    }
    CPU
    namespace Facade
    {
        public class FengShan
        {
            public bool StartWork()
            {
                Console.WriteLine("风扇开始工作。。。");
                return true;
            }
        }
    }
    FengShan
    namespace Facade
    {
        public class Display
        {
            public bool StartWork()
            {
                Console.WriteLine("显示器开始工作。。。");
                return true;
            }
        }
    }
    Display

    运行结果:

  • 相关阅读:
    Mac 虚拟机VMware Fusion显示内部错误的解决方法
    Linux系统中的引导过程与服务控制
    linux系统中如何删除lvm分区
    Linux命令下: LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)
    解决:rm: 无法删除"tomcat": 设备或资源忙
    LVM操作过程
    Linux命令下进行硬盘挂载、分区、删除分区,格式化,卸载方法
    finger 命令查询用户名、主目录、停滞时间、登录时间
    【MySQL】MySQL5.7传统复制切换为GTID复制
    深入理解MySQL系列之锁
  • 原文地址:https://www.cnblogs.com/zkhbalance/p/9426016.html
Copyright © 2011-2022 走看看