解析C#设计模式编程中外观模式Facade Pattern的应用

2019-12-26 18:08:19于丽

  外观类中的代码:


namespace Facade 
{ 
  /// <summary> 
  /// 定义一个外观 
  /// </summary> 
  public class MovieFacade 
  { 
    /// <summary> 
    /// 在外观类中必须保存有子系统中各个对象 
    /// </summary> 
    private Projector projector; 
    private Amplifier amplifier; 
    private Screen screen; 
    private DVDPlayer dvdPlayer; 
    private Light light;
    public MovieFacade() 
    { 
      projector = new Projector(); 
      amplifier = new Amplifier(); 
      screen = new Screen(); 
      dvdPlayer = new DVDPlayer(); 
      light = new Light(); 
    }
    /// <summary> 
    /// 打开电影 
    /// </summary> 
    public void OpenMovie() 
    { 
      //先打开投影仪 
      projector.OpenProjector(); 
      //再打开功放 
      amplifier.OpenAmplifier(); 
      //再打开屏幕 
      screen.OpenScreen(); 
      //再打开 DVD 
      dvdPlayer.OpenDVDPlayer(); 
      //再打开灯光 
      light.OpenLight(); 
    }
    /// <summary> 
    /// 关闭电影 
    /// </summary> 
    public void CloseMovie() 
    { 
      //关闭投影仪 
      projector.CloseProjector(); 
      //关闭功放 
      amplifier.CloseAmplifier(); 
      //关闭屏幕 
      screen.CloseScreen(); 
      //关闭 DVD 
      dvdPlayer.CloseDVDPlayer(); 
      //关闭灯光 
      light.CloseLight(); 
    } 
  } 
}

  客户端代码:


using System;
namespace FacadeTest 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      Facade.MovieFacade movie = new Facade.MovieFacade(); 
      Facade.Projector projector = new Facade.Projector();
        
      //首先是观看电影 
      movie.OpenMovie();
      Console.WriteLine();
       
      //然后是将投影仪模式调到宽屏模式 
      projector.SetWideScreen(); 
      //再将投影仪模式调回普通模式 
      projector.SetStandardScreen(); 
      Console.WriteLine();
      
      //最后就是关闭电影了 
      movie.CloseMovie();
      Console.ReadKey(); 
    } 
  } 
}

  从上例中可以看出,可以在客户端中使用子系统中的内容,即外观模式并没有把子系统和客户端隔离开来,只是提供了整洁的接口给客户端,如果客户端想访问复杂子系统中的接口时还是一样的可以访问的。比如在上面的 Demo 中的设置了宽屏和普通等模式。

外观模式的结构总结
看完外观模式的实现之后,为了帮助理清外观模式中类之间的关系,下面给出上面实现代码中类图:

解析C#设计模式编程中外观模式Facade Pattern的应用