3.5 Facade(外观)

【返回目录】

外观模式适用于系统内部有太多独立的子系统,并且从用户的角度来考虑又必须提供一致且相对简单的接口的情景,因此我觉得用飞机来做一个形象的描述会比较合适,请不要把飞机想象的过于复杂(当然,想象得过于简单也是错误的)。

飞机内部有众多的子系统,假如你有机会进入飞机内部(不是指客舱)看看,你就会看到数不清的各种线路,这些线路连接着各种子系统,并且子系统之间的干扰并不多(否则飞机很容易失控),但是尽管飞行员是经历了4年本科学习并且毕业后还时常参加各种实际飞行和训练,如果飞机的设计师们觉得这样的高智商人才一定可以很轻松地操作复杂的机器,那么飞机也就不再是最安全的交通工具了(抛开成见吧,这是事实)。

我们简单罗列几个子系统:动力系统、导航系统和无线电系统。比如动力系统,飞行员向前推动节流阀,飞机的引擎将加速工作并将飞机推上蓝天;导航系统相当重要,否则飞机就成了瞎子一样,飞行员可以通过GPS来获知自己当前的飞行位置、高度和轨迹等;无线电系统也很重要,飞机的通讯就全靠它了(为了保障飞行安全,飞机上禁止点狼烟),很多时候飞行员都要借助ILS(Instrument Landing System,仪表着陆系统)来保证着陆的安全。但是,飞行员的培养侧重于对飞机的驾驶技术而不是修理,飞行员通过无线电来接受机场ILS信号时并不非要搞清楚电子信号是从哪里接收到又经过哪些电子线路才到达驾驶舱的;飞行员向前推动节流阀的时候,也不是必须知道信号是通过哪些管道到达发动机并控制其转速和油量才能使飞机加速的。飞机之所以安全,有很重要一部分功能是设计师们给飞行员提供了一套相对简单、明了的操作界面。

   1: using System;
   2:  
   3: namespace Autumoon.DesignPatterns.Facade
   4: {
   5:     public class EngineSubSystem
   6:     {
   7:         public void Throttle()
   8:         {
   9:             Console.WriteLine("Throttle of Engine Sub System.");
  10:         }
  11:     }
  12:  
  13:     public class NavigationSubSystem
  14:     {
  15:         public void GPS()
  16:         {
  17:             Console.WriteLine("GPS of Navigation Sub System.");
  18:         }
  19:     }
  20:  
  21:     public class RadioSubSystem
  22:     {
  23:         public void ILS()
  24:         {
  25:             Console.WriteLine("ILS of Radio Sub System.");
  26:         }
  27:     }
  28:  
  29:     public class FacadeDemo
  30:     {
  31:         public void Flight()
  32:         {
  33:             new EngineSubSystem().Throttle();
  34:             new NavigationSubSystem().GPS();
  35:             new RadioSubSystem().ILS();
  36:         }
  37:     }
  38: }

其实经过一段时间的训练,您也可以驾驶飞机的。

   1: static void Main(string[] args)
   2: {
   3:     #region Facade
   4:     new FacadeDemo().Flight();
   5:     #endregion
   6:  
   7:     Console.ReadLine();
   8: }

Cockpit of Boeing 737-300

posted @ 2008-02-20 13:27  麦机长  阅读(697)  评论(0编辑  收藏  举报