zoukankan      html  css  js  c++  java
  • Facade模式(外观模式)

    Facade模式,即外观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。举一个例子:现在有一辆汽车,我们(客户程序)要启动它,那我们就要发动引擎(子系统1),使四个车轮(子系统2)转动。但是实际中我们并不需要用手推动车轮使其转动,我们踩下油门,此时汽车再根据一些其他的操作使车轮转动。油门就好比系统给我们留下的接口,不论汽车是以何种方式转动车轮,车轮变化成什么牌子的,我们要开走汽车所要做的还是踩下油门。

    GoF《设计模式》中说道:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

    Façade外观模式的结构大概是这样的:

    我就上面说的那个情形写一下实现代码,首先我们要实现三个子系统(Wheel、Engine、Body):

         internal class Engine

        {

            public string EngineWork()

            {

                return "BMW's Engine is Working";

            }

            public string EngineStop()

            {

                return "BMW's Engine is stoped";

            }

        }

        internal class Wheel

        {

            public string WheelCircumrotate()

            {

                return "BMW's Wheel is Circumrotating";

            }

            public string WheelStop()

            {

                return "BMW's Wheel is stoped";

            }

        }

        internal class Body

        {

            public Wheel[] wheels = new Wheel[4];

            public Engine engine = new Engine();

            public Body()

            {

                for (int i = 0; i < wheels.Length; i++)

                {

                    wheels[i] = new Wheel();

                }

          }

    }

    然后,我们再来实现汽车的Facade

    class CarFacade

        {

            Body body = new Body();

            public void Run()

            {

                Console.WriteLine(body.engine.EngineWork());

                for(int i = 0; i < body.wheels.Length; i++)

                {

                    Console.WriteLine(body.wheels[i].WheelCircumrotate());

                }

            }

            public void Stop()

            {

                Console.WriteLine(body.engine.EngineStop());

                for (int i = 0; i < body.wheels.Length; i++)

                {

                    Console.WriteLine(body.wheels[i].WheelStop());

                }

          }

    }

    现在我们来使用客户端程序验证一下,代码如下:

    class ClientApp   

    {

            static void Main(string[] args)

            {

                CarFacade car = new CarFacade();

                car.Run();

                car.Stop();

                Console.Read();

            }

    }

    如上面所述:客户端代码(ClientApp)不需要关心子系统,它只需要关心CarFacade所留下来的和外部交互的接口,而子系统是在CarFacade中聚合。

    Façade模式的几个要点:

    1、从客户程序的角度看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。

    2、Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。

    3、Facade模式满足上层稳定,下层易变,类功能单一,在时间线上弹性系数大的特点。

     

  • 相关阅读:
    Django中的CSRF
    CentOS 7上快速安装saltstack
    Django中的Form和ModelForm
    Linux下git使用
    django 登录、注册
    django 知识点小结
    django 博客搭建
    django models中字段
    django models中的class meta
    Django Queryset增加manager
  • 原文地址:https://www.cnblogs.com/junior/p/2353789.html
Copyright © 2011-2022 走看看