程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .net設計模式實例之外觀模式(Façade Pattern)

.net設計模式實例之外觀模式(Façade Pattern)

編輯:關於.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、子系統類集合

1.   namespace FacadePattern
2.   {
3.       /// <summary>
4.       /// Subsystem for making financial transactions
5.       /// </summary>
6.       public class PaymentGateway
7.       {
8.           public bool ChargeStudent(string studentName, int  costTuition)
9.           {
10.               //Charge the student
11.               Console.WriteLine(String.Format("Charging  student {0} for ${1}", studentName, costTuition.ToString()));
12.               return true;
13.           }
14.       }
15.
16.       /// <summary>
17.       /// Subsystem for registration of courses
18.       /// </summary>
19.       public class RegisterCourse
20.       {
21.           public bool CheckAvailability(string courseCode)
22.           {
23.               //Verify if the course is  available..
24.               Console.WriteLine(String.Format("Verifying  availability of seats for the course : {0}", courseCode));
25.               return true;
26.           }
27.
28.           public int GetTuitionCost(string courseCode)
29.           {
30.               //Get the cost of tuition
31.               return 1000;
32.           }
33.       }
34.
35.       /// <summary>
36.       /// Subsystem for Notifying users
37.       /// </summary>
38.       public class NotifyUser
39.       {
40.           public bool Notify(string studentName)
41.           {
42.               //Get the name of the instructor based  on Course Code
43.               //Notify the instructor
44.               Console.WriteLine("Notifying Instructor  about new enrollment");
45.               return true;
46.           }
47.       }
48.   }

2、外觀類Façade Class

1.   /// <summary>
2.        /// The Facade class that simplifies executing methods
         in the subsystems and hides implementation for the  client
3.       /// </summary>
4.       public  class RegistrationFacade
5.       {
6.            private PaymentGateway _paymentGateWay;
7.           private  RegisterCourse _registerCourse;
8.           private  NotifyUser _notifyUser;
9.
10.           public  RegistrationFacade()
11.           {
12.                _paymentGateWay = new PaymentGateway();
13.                _registerCourse = new RegisterCourse();
14.                _notifyUser = new NotifyUser();
15.            }
16.
17.           public bool RegisterStudent(string  courseCode, string studentName)
18.           {
19.                //Step 1: Verify if there are available  seats
20.               if (! _registerCourse.CheckAvailability(courseCode))
21.                    return false;
22.
23.                //Step 2: Charge the student for tuition
24.                if (!_paymentGateWay.ChargeStudent(studentName,  _registerCourse.GetTuitionCost(courseCode)))
25.                    return false;
26.
27.               //Step  3: If everything's successful so far, notify the instructor of the  new registration
28.               return  _notifyUser.Notify(studentName);

3、客戶端代碼

1.    namespace FacadePattern
2.   {
3.       class Program
4.       {
5.           static void Main(string[]  args)
6.           {
7.                RegistrationFacade registrationFacade = new RegistrationFacade();
8.                if (registrationFacade.RegisterStudent ("DesignPatterns101", "Jane Doe"))
9.                    Console.WriteLine("Student Registration SUCCESSFUL!");
10.                else
11.                    Console.WriteLine("Student Registration Unsuccessful");
12.            }
13.       }
14.   }  

五、總結 (Summary)

外觀模式,為子系統的一組接口提供一個統一的界面,此模式定義了一 個高層接口,這一個高層接口使的子系統更加容易使用。

外觀模式可以解決層結構 分離、降低系統耦合度和為新舊系統交互提供接口功能。

出處: http://www.cnblogs.com/ywqu

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved