设计模式学习笔记--Façade外观模式

Façade外观模式:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。[GOF 《设计模式》]。
如何理解:
  比如我们日常使用的电视机遥控板,空调遥控板等等,它们就是我们所使用的具体电气系统(电视,空调)对用户提供的统一的使用接口(界面)Facade,接口上的每一个功能都对应被操控对象(电视、空调)内部的一系列复杂的操作,这些操作是由电气系统自身进行协调动作的,用户并不知它们具体的工作方式和工作细节,以及它们内部具体又有多少子系统以及这些子系统如何使用.....,用户只需要知道,遥控板上提供了哪些功能键,按下它们会有什么作用,仅此而已。
下面我们就以电视为例来说明Facade所起的作用(当然,我们只是为说明而举例,电视机内部真正有哪些子系统,它们如何工作对我们说明此例无关大碍)
程序如下图:

            设计模式学习笔记--Façade外观模式
1、电视机内部复杂的子系统及它们提供的工作方法

设计模式学习笔记--Façade外观模式using System;
设计模式学习笔记--Façade外观模式
using System.Collections.Generic;
设计模式学习笔记--Façade外观模式
using System.Linq;
设计模式学习笔记--Façade外观模式
using System.Text;
设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式
namespace TVFacade
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式    
//客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。
设计模式学习笔记--Façade外观模式    
//电视机内部诸多复杂的子系统,如果用户只能通过具体操作这些子系统来让电视机工作,则对用户而言无疑是苦不堪言,很显然,我们不能让这些子系统直接暴露在用户面前
设计模式学习笔记--Façade外观模式

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式    
遥控信号处理子系统#region 遥控信号处理子系统
设计模式学习笔记--Façade外观模式    
public class SubSystemYaoKong
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式    
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式        
public void YaoKongReceive()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"遥控器信号接收子系统工作");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式        
public void YaoKongAnalyse()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"遥控器信号分析子系统工作");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式    }

设计模式学习笔记--Façade外观模式    
#endregion

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式    
频段转换子系统#region 频段转换子系统
设计模式学习笔记--Façade外观模式    
public class SubSystemPingDuan
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式    
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式        
public void ChangePingDuan()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式             Console.WriteLine(
"频段转换子系统工作");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式        
public void ShouShuoPingDuan()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"搜索频段子系统工作");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式        
public void SavePingDuan()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"保存频段子系统工作");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式        
public void LocatePingDuan()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"定位频段子系统工作");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式    }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式    
#endregion

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式    
节目信号处理子系统#region 节目信号处理子系统
设计模式学习笔记--Façade外观模式    
public class SubSystemInfo
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式    
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式        
public void ReceiveInfos()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"电视信号接收");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式        
public void AnalyseInfo()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"电视信号分析处理");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式        
public void AnalyseTransfer()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"电视信号转换处理");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式        
public void AnalyseShow()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"电视信号显示处理");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式    }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式    
#endregion

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式    
音频子系统#region 音频子系统
设计模式学习笔记--Façade外观模式    
public class SubSystemSounds
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式    
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式        
public void SoundPatternSave()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"音频模式存储子系统");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式        
public void SoundLarger()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"音频数字放大子系统");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式        
public void SoundWisdom()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            Console.WriteLine(
"智能音频管理子系统");
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式    }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式    
#endregion

设计模式学习笔记--Façade外观模式}

设计模式学习笔记--Façade外观模式

2、我们创建的TVFacade,它才是用户直接打交道的界面

设计模式学习笔记--Façade外观模式using System;
设计模式学习笔记--Façade外观模式
using System.Collections.Generic;
设计模式学习笔记--Façade外观模式
using System.Linq;
设计模式学习笔记--Façade外观模式
using System.Text;
设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式
namespace TVFacade
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式    
// 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?这就是Facade需要解决的问题。
设计模式学习笔记--Façade外观模式    
//此处,通过TVFacde,对内我们协调了电视机内部各子系统的工作,对外我们提供了统一的工作接口,外部客户程序只能通过此处提供的对外接口来操作我们的电视机
设计模式学习笔记--Façade外观模式
    class TVFacade
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式    
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式        SubSystemInfo info;
设计模式学习笔记--Façade外观模式        SubSystemPingDuan pingduan;
设计模式学习笔记--Façade外观模式        SubSystemSounds sound;
设计模式学习笔记--Façade外观模式        SubSystemYaoKong yaokong;
设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式        
public TVFacade()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            
this.info = new SubSystemInfo();
设计模式学习笔记--Façade外观模式            
this.pingduan = new SubSystemPingDuan();
设计模式学习笔记--Façade外观模式            
this.sound = new SubSystemSounds();
设计模式学习笔记--Façade外观模式            
this.yaokong = new SubSystemYaoKong();
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
TVFacade对外提供的接口#region TVFacade对外提供的接口
设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
自动搜索频道接口#region 自动搜索频道接口
设计模式学习笔记--Façade外观模式        
public void ScanPingDao()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            yaokong.YaoKongReceive();
设计模式学习笔记--Façade外观模式            yaokong.YaoKongAnalyse();
设计模式学习笔记--Façade外观模式            info.ReceiveInfos();
设计模式学习笔记--Façade外观模式            info.AnalyseInfo();
设计模式学习笔记--Façade外观模式            pingduan.LocatePingDuan();
设计模式学习笔记--Façade外观模式            pingduan.SavePingDuan();
设计模式学习笔记--Façade外观模式            info.AnalyseTransfer();
设计模式学习笔记--Façade外观模式            info.AnalyseShow();
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式        
#endregion

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
音频模式设置接口#region 音频模式设置接口
设计模式学习笔记--Façade外观模式        
public void SetSoundsMode()
设计模式学习笔记--Façade外观模式设计模式学习笔记--Façade外观模式        
设计模式学习笔记--Façade外观模式{
设计模式学习笔记--Façade外观模式            yaokong.YaoKongReceive();
设计模式学习笔记--Façade外观模式            yaokong.YaoKongAnalyse();
设计模式学习笔记--Façade外观模式            sound.SoundPatternSave();
设计模式学习笔记--Façade外观模式            sound.SoundWisdom();
设计模式学习笔记--Façade外观模式        }

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式        
#endregion

设计模式学习笔记--Façade外观模式
设计模式学习笔记--Façade外观模式        
#endregion

设计模式学习笔记--Façade外观模式    }

设计模式学习笔记--Façade外观模式}

设计模式学习笔记--Façade外观模式

 

3、对TVFacade的使用

 

using System;
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();
        }
    }
}

程序运行效果如下:

                        设计模式学习笔记--Façade外观模式

总结

  Facade模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。
效果及实现要点
1.Facade模式对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
2.Facade模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。
3.如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性与通用性之间选择。

适用性
1.为一个复杂子系统提供一个简单接口。
2.提高子系统的独立性。
3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

 

前往:设计模式学习笔记清单

转载于:https://www.cnblogs.com/wsdj-ITtech/archive/2009/10/05/1578110.html