1. 程式人生 > >23種設計模式-外觀模式(Facade Pattern)

23種設計模式-外觀模式(Facade Pattern)

一、 門面(Facade)模式

外部與一個子系統的通訊必須通過一個統一的門面(Facade)物件進行,這就是門面模式。

醫院的例子

用一個例子進行說明,如果把醫院作為一個子系統,按照部門職能,這個系統可以劃分為掛號、門診、劃價、化驗、收費、取藥等。看病的病人要與這些部門打交道,就如同一個子系統的客戶端與一個子系統的各個類打交道一樣,不是一件容易的事情。

首先病人必須先掛號,然後門診。如果醫生要求化驗,病人必須首先劃價,然後繳款,才能到化驗部門做化驗。化驗後,再回到門診室。

解決這種不便的方法便是引進門面模式。可以設定一個接待員的位置,由接待員負責代為掛號、劃價、繳費、取藥等。這個接待員就是門面模式的體現,病人只接觸接待員,由接待員負責與醫院的各個部門打交道。

什麼是門面模式

門面模式要求一個子系統的外部與其內部的通訊必須通過一個統一的門面(Facade)物件進行。門面模式提供一個高層次的介面,使得子系統更易於使用。

就如同醫院的接待員一樣,門面模式的門面類將客戶端與子系統的內部複雜性分隔開,使得客戶端只需要與門面物件打交道,而不需要與子系統內部的很多物件打交道。


二、 門面模式的結構

門面模式是物件的結構模式。門面模式沒有一個一般化的類圖描述,下圖演示了一個門面模式的示意性物件圖:

 

在這個物件圖中,出現了兩個角色:

門面(Facade)角色:客戶端可以呼叫這個角色的方法。此角色知曉相關的(一個或者多個)子系統的功能和責任。在正常情況下,本角色會將所有從客戶端發來的請求委派到相應的子系統去。

子系統(subsystem)角色:可以同時有一個或者多個子系統。每一個子系統都不是一個單獨的類,而是一個類的集合。每一個子系統都可以被客戶端直接呼叫,或者被門面角色呼叫。子系統並不知道門面的存在,對於子系統而言,門面僅僅是另外一個客戶端而已。


三、 門面模式的實現

一個系統可以有幾個門面類

【GOF】的書中指出:在門面模式中,通常只需要一個門面類,並且此門面類只有一個例項,換言之它是一個單例類。當然這並不意味著在整個系統裡只能有一個門面類,而僅僅是說對每一個子系統只有一個門面類。或者說,如果一個系統有好幾個子系統的話,每一個子系統有一個門面類,整個系統可以有數個門面類。

為子系統增加新行為

初學者往往以為通過繼承一個門面類便可在子系統中加入新的行為,這是錯誤的。門面模式的用意是為子系統提供一個集中化和簡化的溝通管道,而不能向子系統加入新的行為。


四、 在什麼情況下使用門面模式

  • 為一個複雜子系統提供一個簡單介面
  • 提高子系統的獨立性
  • 在層次化結構中,可以使用Facade模式定義系統中每一層的入口。


五、 一個例子

我們考察一個保安系統的例子,以說明門面模式的功效。一個保安系統由兩個錄影機、三個電燈、一個遙感器和一個警報器組成。保安系統的操作人員需要經常將這些儀器啟動和關閉。

不使用門面模式的設計

首先,在不使用門面模式的情況下,操作這個保安系統的操作員必須直接操作所有的這些部件。下圖所示就是在不使用門面模式的情況下系統的設計圖。

 


可以看出,Client物件需要引用到所有的錄影機(Camera)、電燈(Light)、感應器(Sensor)和警報器(Alarm)物件。程式碼如下:

using System;

publicclass Camera
{
  
publicvoid TurnOn()
  
{
    Console.WriteLine(
"Turning on the camera.");
  }


  
publicvoid TurnOff()
  
{
    Console.WriteLine(
"Turning off the camera.");
  }


  
publicvoid Rotate(int degrees)
  
{
    Console.WriteLine(
"Rotating the camera by {0} degrees.", degrees);
  }

}


publicclass Light
{

  
publicvoid TurnOff()
  
{
    Console.WriteLine(
"Turning on the light.");
  }


  
publicvoid TurnOn()
  
{
    Console.WriteLine(
"Turning off the light.");
  }


  
publicvoid ChangeBulb()
  
{
    Console.WriteLine(
"changing the light-bulb.");
  }

}


publicclass Sensor
{
  
publicvoid Activate()
  
{
    Console.WriteLine(
"Activating the sensor.");
  }


  
publicvoid Deactivate()
  
{
    Console.WriteLine(
"Deactivating the sensor.");
  }


  
publicvoid Trigger()
  
{
    Console.WriteLine(
"The sensor has triggered.");
  }

}


publicclass Alarm
{

  
publicvoid Activate()
  
{
    Console.WriteLine(
"Activating the alarm.");
  }


  
publicvoid Deactivate()
  
{
    Console.WriteLine(
"Deactivating the alarm.");
  }


  
publicvoid Ring()
  
{
    Console.WriteLine(
"Ringing the alarm.");
  }


  
publicvoid StopRing()
  
{
    Console.WriteLine(
"Stop the alarm.");
  }

}


publicclass Client
{
  
privatestatic Camera camera1, camera2;
  
privatestatic Light light1, light2, light3;
  
privatestatic Sensor sensor;
  
privatestatic Alarm alarm;

  
static Client()
  
{
    camera1 
=new Camera();
    camera2 
=new Camera();
    light1 
=new Light();
    light2 
=new Light();
    light3 
=new Light();
    sensor 
=new Sensor();
    alarm 
=new Alarm();
  }
  

  
publicstaticvoid Main( string[] args )
  
{
    camera1.TurnOn();
    camera2.TurnOn();
    light1.TurnOn();
    light2.TurnOn();
    light3.TurnOn();
    sensor.Activate();
    alarm.Activate();
  }

}

六、 使用門面模式的設計

一個合情合理的改進方法就是準備一個系統的控制檯,作為保安系統的使用者介面。如下圖所示:

 

程式程式碼如下:

using System;

publicclass Camera
{
  
publicvoid TurnOn()
  
{
    Console.WriteLine(
"Turning on the camera.");
  }


  
publicvoid TurnOff()
  
{
    Console.WriteLine(
"Turning off the camera.");
  }


  
publicvoid Rotate(int degrees)
  
{
    Console.WriteLine(
"Rotating the camera by {0} degrees.", degrees);
  }

}


publicclass Light
{

  
publicvoid TurnOff()
  
{
    Console.WriteLine(
"Turning on the light.");
  }


  
publicvoid TurnOn()
  
{
    Console.WriteLine(
"Turning off the light.");
  }


  
publicvoid ChangeBulb()
  
{
    Console.WriteLine(
"changing the light-bulb.");
  }

}


publicclass Sensor
{
  
publicvoid Activate()
  
{
    Console.WriteLine(
"Activating the sensor.");
  }


  
publicvoid Deactivate()
  
{
    Console.WriteLine(
"Deactivating the sensor.");
  }


  
publicvoid Trigger()
  
{
    Console.WriteLine(
"The sensor has triggered.");
  }

}


publicclass Alarm
{

  
publicvoid Activate()
  
{
    Console.WriteLine(
"Activating the alarm.");
  }


  
publicvoid Deactivate()
  
{
    Console.WriteLine(
"Deactivating the alarm.");
  }


  
publicvoid Ring()
  
{
    Console.WriteLine(
"Ringing the alarm.");
  }


  
publicvoid StopRing()
  
{
    Console.WriteLine(
"Stop the alarm.");
  }

}


publicclass SecurityFacade
{
  
privatestatic Camera camera1, camera2;
  
privatestatic Light light1, light2, light3;
  
privatestatic Sensor sensor;
  
privatestatic Alarm alarm;

  
static SecurityFacade()

相關推薦

23設計模式-9.外觀模式Facade Pattern)

動機(Motivate):     在軟體開發系統中,客戶程式經常會與複雜系統的內部子系統之間產生耦合,而導致客戶程式隨著子系統的變化而變化。那麼如何簡化客戶程式與子系統之間的互動介面?如何將複雜系統的內部子系統與客戶程式之間的依賴解耦? 意圖(Intent):     為

23設計模式-外觀模式(Facade Pattern)

一、 門面(Facade)模式 外部與一個子系統的通訊必須通過一個統一的門面(Facade)物件進行,這就是門面模式。 醫院的例子 用一個例子進行說明,如果把醫院作為一個子系統,按照部門職能,這個系統可以劃分為掛號、門診、劃價、化驗、收費、取藥等。看病的病人要與這些

23設計模式-門面模式(外觀模式)Facade

1.產生背景 為什麼需要門面模式 我是一個辛苦一輩子的農民,攢了幾十年錢,現在日子好了,也想建一套屬於自己的小洋樓; 首先,我要僱一個搬磚的和一個和泥的,還要一個會砌牆的人;可是我到哪裡去找這些人,還要一個一個跟他們談價錢;不知道他們和不和得來,會不會幹一半不幹了; 哎,好

23設計模式--中介者模式-Mediator Pattern

ole 缺點 業務 -m ram -- 成了 ons 錯誤 一、中介者模式的介紹 中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,當然筆者也希望來個婚姻中介給我介紹一個哈哈哈,,回歸正題中介者模式分成中介者類和用戶類,根據接口編程的方式我們再把中介和用戶類

23設計模式(21):外觀模式

system res === pan 需要 存在 -s lang 這一 概述: 為子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。 類型:結構型模式。 類圖: 1.當你要為一個復雜子系統提供一個簡單接口時

重走Java設計模式——外觀模式Facade Pattern

外觀模式 定義 外觀模式(Facade Pattern)隱藏系統的複雜性,並向客戶端提供了一個客戶端可以訪問系統的介面。這種型別的設計模式屬於結構型模式,它向現有的系統新增一個介面,來隱藏系統的複雜性。 這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現有系

23設計模式之---單例模式(Singleton Pattern)

1.單例模式 單例模式(Singleton):保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點. 這種設計模式屬於建立型設計模式,提供了一種建立物件的最佳方式.        通常我們可以讓一個全域性變數使得一個物件被訪問,但它不能防止你例項化多個物件.一個最好的辦

23設計模式-門面模式(外觀模式)

1.產生背景 為什麼需要門面模式 我是一個辛苦一輩子的農民,攢了幾十年錢,現在日子好了,也想建一套屬於自己的小洋樓; 首先,我要僱一個搬磚的和一個和泥的,還要一個會砌牆的人;可是我到哪裡去找這些人,還要一個一個跟他們談價錢;不知道他們和不

23設計模式】之 組合模式(Composite Pattern

需求: (1)需要某種樹形結構,可以容納選單、子選單和選單項 (2)需要確定能夠在每個選單的各個項之間遊走,而且至少要像現在用迭代器一樣方便。 (3)需要能夠更有彈性地在選單

設計模式總結之Facade Pattern外觀模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Facade Pattern(外觀模式) 意圖 為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。適用性 * 當你要為一個複雜子系統提供一個簡單介

C#設計模式-外觀模式Facade Pattern

引言 在軟體測試中,一般都是在功能測試穩定的情況下再進行UI自動化測試、或者進行效能測試。如果一個一個進行太麻煩,此時可以使用對外提供一個簡單介面,通過這個介面可以訪問內部一群介面。例如進行UI自動化測試, 那麼執行功能測試後再執行自動化測試。在軟體開發過程中,將對外提供了一個統一的介面,用來訪問子系統中的一

23設計模式介紹以及單例模式的學習

單例模式 餓漢式 23種設計模式 gof23 1、GOF23 設計模式總共分成創建型模式、結構型模式和行為型模式三種: a、創建型模式: - 單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式 b、構建型模式: - 適配器模式、橋接模式、裝配模式、組合模式、建造者模

23設計模式介紹(一)---- 創建型模式

接口 ret static 深復制 return 對象 相互 object c png 由於設計模式篇幅比較大,如果在一篇文章講完所有的設計模式的話不利於閱讀。於是我把它分為三篇文章 23種設計模式介紹(一)---- 創建型模式 23種設計模式介紹(二)---- 結構型模

【Unity與23設計模式】狀態模式(State)

unity public text 開始 sys 狀態模式 改變 val 繼承 定義: “讓一個對象的行為隨著內部狀態的改變而變化,而該對象也像是換了類一樣” 應用場景: 角色AI:控制角色在不同狀態下的AI行為 服務器連接狀態:開始連線、連線中、斷線等狀態 關卡進

轉:23設計模式的應用場景

橋模式 man 16px pop 表示 black strong art bstr 設計模式主要分三個類型:創建型、結構型和行為型。 其中創建型有: 一、Singleton,單例模式:保證一個類只有一個實例,並提供一個訪問它的全局訪問點 ;

【Unity3D與23設計模式】建造者模式(Builder)

產出 private 一個 gof 行為 並且 bstr reac 定義 GoF中定義: “將一個復雜的構建流程與它的對象表現分離出來,讓相同的構建流程可以產生不同的對象行為表現。” 建造者模式可以分為兩個步驟來實施: 1.將復雜的構建流程獨立出來,並將整個流程分成

23設計模式中的叠代器模式

pos over arr imp @override 一個 next() int position 叠代器模式:提供一種方法順序訪問一個聚合對象中的各個對象。 那麽如何提供一個方法順序呢? public interface Iterator<T>{   publ

23設計模式中的訪問者模式

功能需求 封裝 改變 擴展 數據結構 模式 困難 操作 如果 訪問者模式:對於一組對象,在不改變數據結構的前提下,增加作用於這些結構元素新的功能。 適用於數據結構相對穩定,它把數據結構和作用於其上的操作解耦,使得操作集合可以相對自由地演化。 優點: 符合單一職責原則 擴展性

23設計模式中的原型模式

1-1 ... 實例代碼 sets each png 為什麽 .get protect 原型模式:通過復制現有實例來創建新的實例,無須知道相應類的信息。 個人見解:在大量循環時,需要初始化對象,用 原型模式能節省大量的初始化所花費的時間,值得一談的是淺復制和深復制 淺復制:

java 23設計模式

代理 建造者 學習 article 適配器 htm ava arc 叠代 備註這是別人總結的本來想轉載可惜不會怎麽轉載(感謝) 以下是學習過程中查詢的資料,別人總結的資料,比較容易理解(站在各位巨人的肩膀上,望博主勿究) 創建型抽象工廠模式 http://www.cnblo