设计模式学习笔记--Façade外观模式
Façade外观模式:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。[GOF 《设计模式》]。
如何理解:
比如我们日常使用的电视机遥控板,空调遥控板等等,它们就是我们所使用的具体电气系统(电视,空调)对用户提供的统一的使用接口(界面)Facade,接口上的每一个功能都对应被操控对象(电视、空调)内部的一系列复杂的操作,这些操作是由电气系统自身进行协调动作的,用户并不知它们具体的工作方式和工作细节,以及它们内部具体又有多少子系统以及这些子系统如何使用.....,用户只需要知道,遥控板上提供了哪些功能键,按下它们会有什么作用,仅此而已。
下面我们就以电视为例来说明Facade所起的作用(当然,我们只是为说明而举例,电视机内部真正有哪些子系统,它们如何工作对我们说明此例无关大碍)
程序如下图:
1、电视机内部复杂的子系统及它们提供的工作方法
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TVFacade
{
//客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。
//电视机内部诸多复杂的子系统,如果用户只能通过具体操作这些子系统来让电视机工作,则对用户而言无疑是苦不堪言,很显然,我们不能让这些子系统直接暴露在用户面前
遥控信号处理子系统#region 遥控信号处理子系统
public class SubSystemYaoKong
{
public void YaoKongReceive()
{
Console.WriteLine("遥控器信号接收子系统工作");
}
public void YaoKongAnalyse()
{
Console.WriteLine("遥控器信号分析子系统工作");
}
}
#endregion
频段转换子系统#region 频段转换子系统
public class SubSystemPingDuan
{
public void ChangePingDuan()
{
Console.WriteLine("频段转换子系统工作");
}
public void ShouShuoPingDuan()
{
Console.WriteLine("搜索频段子系统工作");
}
public void SavePingDuan()
{
Console.WriteLine("保存频段子系统工作");
}
public void LocatePingDuan()
{
Console.WriteLine("定位频段子系统工作");
}
}
#endregion
节目信号处理子系统#region 节目信号处理子系统
public class SubSystemInfo
{
public void ReceiveInfos()
{
Console.WriteLine("电视信号接收");
}
public void AnalyseInfo()
{
Console.WriteLine("电视信号分析处理");
}
public void AnalyseTransfer()
{
Console.WriteLine("电视信号转换处理");
}
public void AnalyseShow()
{
Console.WriteLine("电视信号显示处理");
}
}
#endregion
音频子系统#region 音频子系统
public class SubSystemSounds
{
public void SoundPatternSave()
{
Console.WriteLine("音频模式存储子系统");
}
public void SoundLarger()
{
Console.WriteLine("音频数字放大子系统");
}
public void SoundWisdom()
{
Console.WriteLine("智能音频管理子系统");
}
}
#endregion
}
2、我们创建的TVFacade,它才是用户直接打交道的界面
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TVFacade
{
// 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?这就是Facade需要解决的问题。
//此处,通过TVFacde,对内我们协调了电视机内部各子系统的工作,对外我们提供了统一的工作接口,外部客户程序只能通过此处提供的对外接口来操作我们的电视机
class TVFacade
{
SubSystemInfo info;
SubSystemPingDuan pingduan;
SubSystemSounds sound;
SubSystemYaoKong yaokong;
public TVFacade()
{
this.info = new SubSystemInfo();
this.pingduan = new SubSystemPingDuan();
this.sound = new SubSystemSounds();
this.yaokong = new SubSystemYaoKong();
}
TVFacade对外提供的接口#region TVFacade对外提供的接口
自动搜索频道接口#region 自动搜索频道接口
public void ScanPingDao()
{
yaokong.YaoKongReceive();
yaokong.YaoKongAnalyse();
info.ReceiveInfos();
info.AnalyseInfo();
pingduan.LocatePingDuan();
pingduan.SavePingDuan();
info.AnalyseTransfer();
info.AnalyseShow();
}
#endregion
音频模式设置接口#region 音频模式设置接口
public void SetSoundsMode()
{
yaokong.YaoKongReceive();
yaokong.YaoKongAnalyse();
sound.SoundPatternSave();
sound.SoundWisdom();
}
#endregion
#endregion
}
}
3、对TVFacade的使用
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TVFacade
{
class Program
{
static void Main(string[] args)
{
//使用Facade提供的高层接口来控制我们的电视机
TVFacade tv = new TVFacade();
Console.WriteLine("-----------按下TV遥控板的自动搜索频道按键----------");
tv.ScanPingDao();
Console.WriteLine("-----------按下TV遥控板的剧场音效设置按键----------");
tv.SetSoundsMode();
Console.ReadLine();
}
}
}
程序运行效果如下:
总结
Facade模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。
效果及实现要点
1.Facade模式对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
2.Facade模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。
3.如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性与通用性之间选择。
适用性
1.为一个复杂子系统提供一个简单接口。
2.提高子系统的独立性。
3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。
前往:设计模式学习笔记清单
转载于:https://www.cnblogs.com/wsdj-ITtech/archive/2009/10/05/1578110.html