1. 程式人生 > >門面(Facade)模式

門面(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()

相關推薦

門面Facade模式

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

設計模式:外觀Facade模式

text 一起 其它 QQ 如何 互調 IT 抽象 整合 設計模式:外觀(Facade)模式 一、前言 外觀模式是一種非常簡單的模式,簡單到我們經常都會使用,比如對於類A和B,如果兩者需要交互,經過一定的處理過程才能實現某一個具體的功能,那麽我們可以將這個處理的過程定義

java23種設計模式-門面外觀模式

定義 外觀模式為子系統的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 UML 角色 子系統(SubSystem): 表示一個系統的子系統或者模組 門面(Facade): 客戶端通過門面間接控制子系統。門面遮蔽

設計模式的征途—11.外觀Facade模式

在軟體開發中,有時候為了完成一項較為複雜的功能,一個類需要和多個其他業務類互動,而這些需要互動的業務類經常會作為一個完整的整體出現,由於涉及的類比較多,導致使用時程式碼較為複雜,此時,特別需要一個類似服務員一樣的角色,由他來負責和多個業務類進行互動,而使用這些業務類的類只需要和該類進行互動即可。外觀模式通過引

外觀Facade模式

什麼是(Facade)模式?     Facade(外觀)模式為子系統中的各類(或結構與方法)提供一個簡明一致的介面,隱藏子系統的複雜性,使子系統更加容易使用(出自百度文庫)。即當子系統複雜或者繁鎖時,我們讓子系統提供一個視窗,程式中稱為介面,其它程式或者物件就通過這個

設計模式之外觀facade模式

一、概念介紹   外觀模式(Facade),他隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面。這種型別的設計模式屬於結構性模式。為子系統中的一組介面提供了一個統一的訪問介面,這個介面使得子系統更容易被訪問或者使用。  二、角色及使用場景   簡單來說,該

Laravel5 建立自定義門面Facade

門面為應用服務容器中的繫結類提供了一個“靜態”介面。Laravel 內建了很多門面,你可能在不知道的情況下正在使用它們。Laravel 的門面作為服務容器中底層類的“靜態代理”,相比於傳統靜態方法

單例模式singleton,工廠方法模式factory門面模式facade

CEmperor,需要單例的類 說明:很多大臣拜見的皇帝,只有一個。體現在面向物件方面,CEmperor定義一個靜態指標,和一個靜態函式,私有化建構函式、解構函式、建構函式複製、過載賦值語句。 注意:執行緒安全,採用互斥體的方式實現。 Public class Si

php設計模式----門面模式facade

在laravel看到了Facade這個詞,這裡是文件。 挺簡單的一個模式,記錄在這裡,其實也很常用。基本定義我參考的百度。 一、舉個例子 我們出去旅行,對於同樣的路線,跟團和自費有什麼區別。 跟團的好處是省心,繳費以後路線,車,門票都不用再操心了。 自費的好處是今天

設計模式 | 外觀模式/門面模式facade

結構 之前 有意 mina 應該 問題 pack src ack 定義: 為子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。 結構:(書中圖,侵刪) 一個簡潔易用的外觀類 一個復雜的子系統 實例: 書中提到了理財

外觀模式Facade

edi lena () 聲明 string urn ade rop 要求 Facade? 如果是按照RUP+ 的開發模式,隨著叠代與增量的進行,軟件代碼會越來越龐大,各個模塊之間的關系會越來越復雜,如何你是初次接受該項目的開發非非常棘手,要理解清楚他們之間的關系,才能繼續完

設計模式之外觀模式Facade

設計模式之外觀模式(Facade) 場景 病人去醫院看病,首先病人必須先掛號,然後門診。如果醫生要求化驗,病人必須首先劃價,然後繳費,才可以到化驗部門做化驗。化驗後再回到門診室。 解決這種不便的方法便是引進外觀模式,醫院可以設定一個接待員的位置,由接待員負責代為掛號、劃價

設計模式6—— 結構型 ——外觀Facade

簡介 定義:又叫門面模式,提供一個統一的介面,用來訪問子系統中的一群介面。 解釋:外觀模式定義了一個高層介面,讓子系統更容易被使用。 型別:結構型 適用場景: 子系統越來越複雜,外觀模式能夠提供簡單的呼叫介面。

設計模式-外觀模式Facade

外觀模式又稱為門面模式,為一組類似功能的叢集,比如類庫、子系統等,提供一致的入口供client呼叫 角色和職責: 1.門面(Facade)-Computer:    外觀模式的核心。它被客戶角色呼叫,它熟悉子系統的功能。內部根據客戶角色的需求預定了幾種功能的組合 2.子系統(Pac

PHP設計模式之外觀模式Facade瞭解下

這個外觀模式,就是通過在必需的邏輯和方法的集合前建立簡單的外觀介面,並且還會隱藏了呼叫物件的複雜性,它和建造者模式非常相似,建造者模式一般是簡化物件的呼叫的複雜性,但是外觀模式一般是簡化含有很多邏輯步驟和方法呼叫的複雜性。 來看下例項,先來描述下: 設計一個User類,裡

Facade外觀模式

  外觀模式是類結構型設計模式之一,描述的是一組具有類似功能的類群。 案例:輸入系統中有多個輸入子系統:鍵盤、觸控式螢幕、滑鼠等,它們都要為上層應用程式提供x、y座標。   若使用者程式碼直

介面型模式Facade外觀模式

1.如果你期望為一組類提供一個簡單的介面,可使用Facade(外觀)模式。 2.舉例: 2.1uml模型 2.2原始碼 //模擬第一個操作:開啟第一個抽屜 public class DrawerOne { public void open(

設計模式學習總結:外觀模式Facade

1.場景分析 如下圖所示,我們有一個家庭影院系統,其中包含了調音器、擴音器、播放器、劇場光、爆米花機等部分: 然後我們模擬使用這個系統來播放一部電影,則我們需要進行一下操作: //開啟爆米花機,開始爆米花 popper.on() popper.pop(

設計模式總結篇系列:外觀模式Facade

張三自從畢業後開始做軟體開發,做著做著發現不爽了,錢賺不了太多,頭髮也白了。於是拿著一點小資本,想著做點小生意。瞅著眼前的餐飲行業還不錯,於是打算開一家餐館。開參觀可不是一件容易的事,僅僅行政類的審批流程就不少。至少包括辦理衛生許可證,辦理稅務登記,辦理工商登記等。 我們

設計模式的征途—5.原型Prototype模式

pla width 共享 太多的 isp text 一模一樣 軟件 集合 相信大多數的人都看過《西遊記》,對孫悟空拔毛變出小猴子的故事情節應該都很熟悉。孫悟空可以用猴毛根據自己的形象復制出很多跟自己一模一樣的小猴兵出來,其實在設計模式中也有一個類似的模式,我們可以通過一個原