外觀模式

設計模式—外觀模式

前言

軟件開發過程中,客戶端經常與複雜的系統內部的子系統進行耦合,從而導致客戶單程序隨着子系統的變化而變化,爲了將他們解耦而產生是外觀模式,也稱作門面模式

外觀模式介紹

外觀模式提供了統一的接口,用來訪問子系統中的一羣接口,外觀定義了一個高層接口,讓子系統更容易使用。即創建一個統一的類用來保證子系統中一個或多個負責的類型,客戶端直接通過外觀模式來調用子系統的方法,從而減少了客戶端和子系統的耦合

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)使用場景

爲一個複雜的子系統提供簡單的接口

提供子系統的獨立性

在層次結構中,可以定義外觀模式定義系統中每一層的入口

分類: 設計模式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章