设计模式之外观模式(九)

设计模式之外观模式

一、引言

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

二、介绍 

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

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

何时使用: 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

运行结果:

 

posted @ 2018-08-05 15:45  zkh-balance  阅读(149)  评论(0编辑  收藏  举报