設計模式—外觀模式
前言
軟件開發過程中,客戶端經常與複雜的系統內部的子系統進行耦合,從而導致客戶單程序隨着子系統的變化而變化,爲了將他們解耦而產生是外觀模式,也稱作門面模式
外觀模式介紹
外觀模式提供了統一的接口,用來訪問子系統中的一羣接口,外觀定義了一個高層接口,讓子系統更容易使用。即創建一個統一的類用來保證子系統中一個或多個負責的類型,客戶端直接通過外觀模式來調用子系統的方法,從而減少了客戶端和子系統的耦合
1)實際例子
學生選擇課程並且通知功能
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
/// <summary>
/// 以學生選課系統爲例子演示外觀模式的使用
/// 學生選課模塊包括功能有:
/// 驗證選課的人數是否已滿
/// 通知用戶課程選擇成功與否
/// 外觀類
public class RegistrationFacade
{
private RegisterCourse _registerCourse;
private NotifyStudent _notifyStudent;
public RegistrationFacade()
{
_registerCourse = new RegisterCourse();
_notifyStudent = new NotifyStudent();
}
public bool RegisterCourse(string courseName, string studentName)
{
if (!_registerCourse.CheckAvaliable(courseName))
{
return false;
}
return _notifyStudent.Notify(studentName);
}
}
public class RegisterCourse
{
public bool CheckAvaliable(string courseName)
{
Console.WriteLine("正在驗證課程{0}是否人數已滿", courseName);
return true;
}
}
public class NotifyStudent
{
public bool Notify(string studentName)
{
Console.WriteLine("正在向學生{0}發送通知", studentName);
return true;
}
}
}
客戶端調用不使用外觀模式:
void test()
{
RegisterCourse registerCourse = new RegisterCourse();
NotifyStudent notifyStudent = new NotifyStudent();
var courseName = "C#";
var studentName = "明明";
if (!registerCourse.CheckAvaliable(courseName))
{
Console.WriteLine("選課失敗");
}
if (notifyStudent.Notify(studentName))
Console.WriteLine("選課成功");
else
Console.WriteLine("選課失敗");
}
使用外觀模式:
static void Main(string[] args)
{
RegistrationFacade facade = new RegistrationFacade();
if (facade.RegisterCourse("C#", "明明"))
Console.WriteLine("選課成功");
else
Console.WriteLine("選課失敗");
}
2)外觀模式介紹
使用外觀模式降低了客戶單和子系統的耦合度。外觀模式核心是:有外觀類去保存各個子系統的引用,實現由一個統一的外觀類去包裝多個子系統,而客戶單只需要引用這個外觀類,然後有外觀類來調用各個子系統。
這樣的模式類型與適配器模式,但是有不同:適配器是將一個對象包裝起來以改變其接口,而外觀模式是將一羣對象包裝起來以簡化其接口,意圖不一樣。
外觀類角色:客戶端調用這個角色方法,該角色知道相關的一個或多個子系統的功能和自然,從客戶端發出的請求委派到相應的子系統中
3)外觀模式分析
優點:外觀模式屏蔽了子系統組件,從而簡化了接口,減少客戶端處理的對象數據並使子系統的使用更加簡單
外觀模式實現了客戶單和子系統的耦合關鍵,而子系統內部的功能是緊耦合的,鬆耦合是子系統的變化不會影響到客戶端
缺點:如果修改了子系統那麼需要修改外觀類或客戶端的源碼
4)使用場景
爲一個複雜的子系統提供簡單的接口
提供子系統的獨立性
在層次結構中,可以定義外觀模式定義系統中每一層的入口