ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
年年作品展,岁岁不同样,鹅黄新绿涟漪泛起思想的火花却不尽相同,十期的作品展,从13年3月20号开始到完美落幕,时至今日,她已经在我的记忆中成为过去,这朵小小的浪花激起的涟漪渐渐褪去,也许已没有也许,但那抹如琉璃般的记忆也在这片平静中渐渐凝成永恒。当再次凝眸十一期的那群孩子,笑意浅浅,心事微澜。今天是十一期作品展的日子,看到她们多像去年的我,揣测激情与梦想来到这淡紫色蒲公英飞舞的土地。昨天晚上抽空去看了看十一期的作品展彩排,彩排的过程中,有五彩的灯光,有展示作品的大屏幕,投影仪,还有音响,在整个作品展示的过程中,十一期孩子的后勤人员中,有人负责关闭灯光和打开灯光,有人负责打开和关闭投影仪,一个个作品的衔接需要打开和关闭大屏幕,有的作品是音乐类的软件,这个时候就要控制音量,打开和关闭音响,咦?这一连串的流程怎么会如此熟悉,猛然间,恍惚,这个俨然就是我们大话设计中的外观模式啊。 外观模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。首先我们来看一下我们外观模式的结构图:         ![](https://box.kancloud.cn/2015-12-30_5683743923649.jpg) 依然以我们的上述十一期作品展为例,来看看我们的类图:        ![](https://box.kancloud.cn/2015-12-30_5683743933095.jpg) 画好了类图,来看看我们代码是如何实现的呢?我们先来看看灯光,投影仪,大屏幕,音响的代码:          ~~~ using System;   namespace Facade    {        ///         // 投影仪               public class Projector        {            public void OpenProjector()            {                Console.WriteLine("打开投影仪");            }           public void CloseProjector()            {                Console.WriteLine("关闭投影仪");            }                  }        //灯光        public class Light        {            public void OpenLight()            {                Console.WriteLine("打开灯光");            }           public void CloseLight()            {                Console.WriteLine("关闭灯光");            }        }                //屏幕        public class Screen        {            public void OpenScreen()            {                Console.WriteLine("打开屏幕");            }           public void CloseScreen()            {                Console.WriteLine("关闭屏幕");            }        }        //音响        public class  Acoustics         {            public void Acoustics  ()            {                Console.WriteLine("打开音响");            }           public void CloseAcoustics  ()            {                Console.WriteLine("关闭音响");            }        }    }   ~~~ 外观类中的代码: ~~~    public class ProductionFacade        {                       /// 在外观类中必须保存有子系统中各个对象                        private Projector projector;            private Light  light;            private Screen screen;            private Acoustics   acoustics;                       public ProductionFacade()            {                projector = new Projector();                light = new Light();                screen = new Screen();                acoustics=new Acoustics();                         }           ///             /// 作品开始           ///             public void OpenProduction()            {                //先打开灯光               light.OpenLight();                //打开投影               projector.OpenProjector();                //再打开屏幕                screen.OpenScreen();                //再打开音响               acoustics.OpenAcoustics();                           }           ///             /// 作品结束           ///             public void CloseProduction()            {                //关闭灯光               light.CloseLight();                //关闭投影               projector.CloseProjector();                //关闭屏幕                screen.CloseScreen();                //关闭音响               acoustics.CloseAcoustics();                           }                 }    }   ~~~ 客户端的代码: ~~~  static void Main(string[] args)            {                Facade.ProductionFacade movie = new Facade.ProductionFacade();                Facade.Projector projector = new Facade.Projector();                                  //首先是观看作品                movie.OpenProduction();               Console.WriteLine();                                             //最后就是关闭作品了                movie.CloseProduction();               Console.ReadKey();            }    ~~~ 简单的说,就是外观模式将一个或者多个类的复杂的操作进行了隐藏,只显示一个一致的界面供客户端使用。需要注意的是,外观模式仅仅是给我们提供了更为直接和容易地操作方式,她并没有把原来的子系统进行隔离,所以,如果你还需要子系统类的更高层的功能,还是可以使用原来的子系统,这个是外观模式的一大优点,通过外观模式可以将子系统的接口上建立一个高层接口,并且将这个高层接口提供给客户端使用,这样便开业解除掉客户端和复杂子系统之间的耦合。 十一期的作品展今天晚上在学府拉开序幕,祝福你们,愿这朵小小的浪花在IT的海洋里激起惊涛骇浪,我的大话设计依然在继续........