1、外观模式定义
提供了一个统一的接口,用来访问子系统中的一群接口,让子系统更容易使用。
2、要点
当需要用到一个现有的类而其接口不符合你的需要时,就使用适配器模式
当需要简化并统一一个很大的接口或一群复杂的接口时,使用外观模式
适配器改变接口以符合客户的期望
外观将客户从一个复杂的子系统中解耦
实现一个适配器可能需要一番功夫,也可能不费工夫,视目标接口的大小和复杂程度实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行
适配器模式有两种模式,对象适配器和类适配器,类适配器需要用到多重jicheng
可以为一个子系统实现一个以上的外观
适配器将一个对象包装起来以改变其接口,装饰者将一个对象包装起来以增加新的职责,而外观是将一群对象包装起来以简化其接口
3、例子代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FacadePattern
{
/// <summary>
/// 功放
/// </summary>
public class Tuner
{
public void on()
{
Console.WriteLine("Tuner_On");
}
public void off()
{
Console.WriteLine("Tuner_Off");
}
}
/// <summary>
/// DVD播放器
/// </summary>
public class DVDPlayer
{
public void on()
{
Console.WriteLine("DVDPlayer_On");
}
public void play()
{
Console.WriteLine("DVDPlayer_play");
}
public void off()
{
Console.WriteLine("DVDPlayer_Off");
}
}
/// <summary>
/// CD播放器
/// </summary>
public class CDPlayer
{
public void on()
{
Console.WriteLine("CDPlayer_On");
}
public void play()
{
Console.WriteLine("CDPlayer_play");
}
public void off()
{
Console.WriteLine("CDPlayer_Off");
}
}
/// <summary>
/// 投影仪
/// </summary>
public class Projector
{
public void on()
{
Console.WriteLine("Projector_On");
}
public void off()
{
Console.WriteLine("Projector_Off");
}
}
/// <summary>
/// 灯光
/// </summary>
public class TheaterLights
{
public void on()
{
Console.WriteLine("TheaterLights_On");
}
public void off()
{
Console.WriteLine("TheaterLights_Off");
}
}
/// <summary>
/// 屏幕
/// </summary>
public class Screen
{
public void up()
{
Console.WriteLine("Screen_Up");
}
public void down()
{
Console.WriteLine("Screen_Down");
}
}
/// <summary>
/// 爆米花机
/// </summary>
public class PopCornPopper
{
public void on()
{
Console.WriteLine("PopCornPopper_On");
}
public void pop()
{
Console.WriteLine("PopCornPopper_Pop");
}
public void off()
{
Console.WriteLine("PopCornPopper_Off");
}
}
public class Amplifier
{
public void on()
{
Console.WriteLine("Amplifier_On");
}
public void off()
{
Console.WriteLine("Amplifier_Off");
}
public void setDVD()
{
Console.WriteLine("Amplifier_setDVD");
}
public void setCD()
{
Console.WriteLine("Amplifier_setCD");
}
public void setTuner()
{
Console.WriteLine("Amplifier_setTuner");
}
}
/// <summary>
/// 家庭影院
/// </summary>
public class HomeTheaterFacade
{
private Amplifier m_Amplifier;
private Tuner m_Tuner;
private DVDPlayer m_DVDPlayer;
private CDPlayer m_CDPlayer;
private Projector m_Projector;
private TheaterLights m_Lights;
private Screen m_Screen;
private PopCornPopper m_PopCorn;
public HomeTheaterFacade(Amplifier m_Amplifier, Tuner m_Tuner, DVDPlayer m_DVDPlayer, CDPlayer m_CDPlayer, Projector m_Projector,
TheaterLights m_Lights, Screen m_Screen, PopCornPopper m_PopCorn)
{
this.m_Amplifier = m_Amplifier;
this.m_CDPlayer = m_CDPlayer;
this.m_DVDPlayer = m_DVDPlayer;
this.m_Lights = m_Lights;
this.m_PopCorn = m_PopCorn;
this.m_Projector = m_Projector;
this.m_Screen = m_Screen;
this.m_Tuner = m_Tuner;
}
public void WatchMovie()
{
Console.WriteLine("Ready to Watch movie");
m_PopCorn.on();
m_PopCorn.pop();
m_Lights.off();
m_Screen.down();
m_Projector.on();
m_Amplifier.on();
m_Amplifier.setDVD();
m_DVDPlayer.on();
m_DVDPlayer.play();
}
public void EndMovie()
{
Console.WriteLine("shutting down movie");
m_PopCorn.off();
m_Lights.on();
m_Screen.up();
m_Projector.off();
m_Amplifier.off();
m_DVDPlayer.off();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FacadePattern
{
class Program
{
static void Main(string[] args)
{
HomeTheaterFacade pHomeTheaterFacade = new HomeTheaterFacade
(new Amplifier(), new Tuner(), new DVDPlayer(), new CDPlayer(), new Projector(),
new TheaterLights(), new Screen(), new PopCornPopper());
pHomeTheaterFacade.WatchMovie();
pHomeTheaterFacade.EndMovie();
}
}
}
4、主要类图