您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎樣理解NET設計模式實例中的外觀模式,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
一、外觀模式簡介(Brief Introduction)
外觀模式,為子系統的一組接口提供一個統一的界面,此模式定義了一個高層接口,這一個高層接口使的子系統更加容易使用。
二、解決的問題(What To Solve)
1、分離不同的兩個層
典型的分層例子是Net三層架構,界面層與業務邏輯層分離,業務邏輯層與數據訪問層分類。這樣可以為子系統提供統一的界面和接口,降低了系統的耦合性。
2、減少依賴
隨著功能增加及程序的重構,系統會變得越來越復雜,這時增加一個外觀可以提供一個簡單的接口,減少他們之間的依賴。
3、為新舊系統交互提供接口
有的時候,新系統需要舊系統的核心功能,而這個舊的系統已經很難維護和擴展,可以給新系統增加一個Façade類,是的新系統與Façade類交互,Façade類與舊系統交互素有復雜的工作。
三、外觀模式分析(Analysis)
1、外觀模式結構
2、源代碼
1、子系統類SubSystemOne
public class SubSystemOne { public void MethodOne() { Console.WriteLine("執行子系統One中的方法One"); } }
2、子系統類SubSystemTwo
public class SubSystemTwo { public void MethodTwo() { Console.WriteLine("執行子系統Two中的方法Two"); } }
3、子系統類SubSystemThree
public class SubSystemThree { public void MethodThree() { Console.WriteLine("執行子系統Three中的方法Three"); } }
4、Facade 外觀類,為子系統類集合提供更高層次的接口和一致的界面
public class Facade { SubSystemOne one; SubSystemTwo two; SubSystemThree three; public Facade() { one = new SubSystemOne(); two = new SubSystemTwo(); three = new SubSystemThree(); } public void MethodA() { Console.WriteLine("開始執行外觀模式中的方法A"); one.MethodOne(); two.MethodTwo(); Console.WriteLine("外觀模式中的方法A執行結束"); Console.WriteLine("---------------------------"); } public void MethodB() { Console.WriteLine("開始執行外觀模式中的方法B"); two.MethodTwo(); three.MethodThree(); Console.WriteLine("外觀模式中的方法B執行結束"); } }
5、客戶端代碼
static void Main(string[] args) { Facade facade = new Facade(); facade.MethodA(); facade.MethodB(); Console.Read(); }
3、程序運行結果
四.案例分析(Example)
1、場景
假設遠程網絡教育系統-用戶注冊模塊包括功能有
1、驗證課程是否已經滿人
2、收取客戶費用
3、通知用戶課程選擇成功
如下圖所示
子系統類集合包括:PaymentGateway類、RegisterCourse類、NotifyUser類
PaymentGateway類:用戶支付課程費用
RegisterCourse類:驗證所選課程是否已經滿人以及計算課程的費用
NotifyUser類:" 用戶選擇課程成功與否"通知用戶
RegistrationFacade類:外觀類,提供一個統一的界面和接口,完成課程校驗、網上支付、通知用戶功能
2、代碼
1、子系統類集合
namespace FacadePattern { /// <summary> /// Subsystem for making financial transactions /// </summary> public class PaymentGateway { public bool ChargeStudent(string studentName, int costTuition) { //Charge the student Console.WriteLine(String.Format("Charging student {0} for ${1}", studentName, costTuition.ToString())); return true; } } /// <summary> /// Subsystem for registration of courses /// </summary> public class RegisterCourse { public bool CheckAvailability(string courseCode) { //Verify if the course is available.. Console.WriteLine(String.Format("Verifying availability of seats for the course : {0}", courseCode)); return true; } public int GetTuitionCost(string courseCode) { //Get the cost of tuition return 1000; } } /// <summary> /// Subsystem for Notifying users /// </summary> public class NotifyUser { public bool Notify(string studentName) { //Get the name of the instructor based on Course Code //Notify the instructor Console.WriteLine("Notifying Instructor about new enrollment"); return true; } } }
2、外觀類Façade Class
/// <summary> /// The Facade class that simplifies executing methods in the subsystems and hides implementation for the client /// </summary> public class RegistrationFacade { private PaymentGateway _paymentGateWay; private RegisterCourse _registerCourse; private NotifyUser _notifyUser; public RegistrationFacade() { _paymentGateWay = new PaymentGateway(); _registerCourse = new RegisterCourse(); _notifyUser = new NotifyUser(); } public bool RegisterStudent(string courseCode, string studentName) { //Step 1: Verify if there are available seats if (!_registerCourse.CheckAvailability(courseCode)) return false; //Step 2: Charge the student for tuition if (!_paymentGateWay.ChargeStudent(studentName, _registerCourse.GetTuitionCost(courseCode))) return false; //Step 3: If everything's successful so far, notify the instructor of the new registration return _notifyUser.Notify(studentName);
3、客戶端代碼
namespace FacadePattern { class Program { static void Main(string[] args) { RegistrationFacade registrationFacade = new RegistrationFacade(); if (registrationFacade.RegisterStudent("DesignPatterns101", "Jane Doe")) Console.WriteLine("Student Registration SUCCESSFUL!"); else Console.WriteLine("Student Registration Unsuccessful"); } } }
五、總結(Summary)
外觀模式,為子系統的一組接口提供一個統一的界面,此模式定義了一個高層接口,這一個高層接口使的子系統更加容易使用。
外觀模式可以解決層結構分離、降低系統耦合度和為新舊系統交互提供接口功能。
以上就是怎樣理解NET設計模式實例中的外觀模式,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。