外观类中的代码:
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 中的设置了宽屏和普通等模式。
外观模式的结构总结
看完外观模式的实现之后,为了帮助理清外观模式中类之间的关系,下面给出上面实现代码中类图:










