facade 門面 php,php設計模式之門面(Facade)模式

4faac543fb292ff220b091a985bedbed.png

該模式屬于結構型模式

什么是門面模式?

定義:門面模式(有時候也稱為外觀模式)是指提供一個統一的接口去訪問多個子系統的多個不同的接口,它為子系統中的一組接口提供一個統一的高層接口。

外部與子系統的通信是通過一個門面(Facade)對象進行。

其實門面模式就是把幾個子系統(實例或者類.統一一個統一的接口進行執行,客戶端不用關注子系統,只用門面即可)

通俗的來說:將多個接口封裝為一個接口,比如調用A()方法,實則A()方法內部進行了多次不同程度的封裝,我們不需要關心A()方法內部的封裝有多復雜只需要調用A()方法來實現我們的目的即可。

話不多說上demo代碼://門面模式模擬:打開以及關閉照相機為例

//兩步:打開閃光燈、打開照相機

//?????關閉閃光燈、關閉照相機

//閃光燈類

class?Light

{

public?function?turnOn()

{

echo?'打開閃光燈
';

}

public?function?turnOff()

{

echo?'關閉閃光燈
';

}

}

//照相機類

class?Camera

{

public?function?active()

{

echo?'打開照相機
';

}

public?function?deactive()

{

echo?'關閉照相機
';

}

}

//按照傳統模式來實現照相?代碼肯定是如下這么寫的

/*

$light??=?new?Light();

$camera?=?new?Camera();

$light->turnOn();??//打開閃光燈

$camera->active();?//開始照相

*/

//以上這種方式不好,因為用戶需要調用2個接口才能完成工作,那我們能不能只讓用戶調用1一個接口就可以完成這個工作呢?

/*********偉大的分割線之門面(Facade)模式登場************/

//創建一個門面類

class?Facade

{

protected?$light;

protected?$camera;

public?function?__construct()

{

$this->light??=?new?Light();

$this->camera?=?new?Camera();

}

//照相的方法

public?function?start()

{

$this->light->turnOn();

$this->camera->active();

}

//關閉照相

public?function?stop()

{

$this->light->turnOff();

$this->camera->deactive();

}

}

//測試

$facade?=?new?Facade();

$facade->start();?//開始照相

echo?'


';

$facade->stop();?//關閉照相

/**

*經過上面的門面模式這種方式的改造,我們再去照相的時候,對于用戶對于客戶端來說,使用的時候就非常方便了

*開始照相只需要調用一個start方法,關閉照相只需要調用一個stop方法

*/

優點:

1、它對客戶屏蔽了子系統組件,因而減少了客戶處理的對象的數目并使得子系統使用起來更加方便。

2、實現了子系統與客戶之間的松耦合關系。

3、如果應用需要,它并不限制它們使用子系統類。因此可以在系統易用性與能用性之間加以選擇。

適用場景:

1、為一些復雜的子系統提供一組接口。

2、提高子系統的獨立性。

3、在層次化結構中,可以使用門面模式定義系統的每一層的接口。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534824.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534824.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

架構師一般做到多少歲_《迷茫中的我們該如何突破瓶頸——成長為一名架構師》...

如何成長為一名架構師?架構師是一個既需要掌控整體又需要洞悉局部瓶頸并依據具體的業務場景給出解決方案的團隊領導型人物。一個架構師得需要足夠的想像力,能把各種目標需求進行不同維度的擴展,為目標客戶提供更為全面的需求清單。很多程序員想成為一名架…

php-fpm初始化失敗,FPM的初始化 - [ PHP7的內核剖析 ] - 在線原生手冊 - php中文網

FPM的初始化接下來看下fpm的啟動流程,從main()函數開始://sapi/fpm/fpm/fpm_main.cint main(int argc, char *argv[]){... //注冊SAPI:將全局變量sapi_module設置為cgi_sapi_modulesapi_startup(&cgi_sapi_module);... //執行php_module_staru…

python 高級語言特性_Pytohon學習筆記(一)Python編程語言歷史及特性

Python編程語言歷史及特性編程語言:用戶:問題空間計算機: 解決問題解空間抽象機器代碼-->微碼編程-->高級語言shell編程:ptyhon控制語言:膠水語言適合領域:web,Django字節碼:bytecode面向過程:以指令為中心,由指令處理數據 如何組織代碼結局問題面向對象:以數…

php laravel 返回統一格式,封裝的統一的Laravel響應類,返回數據類

封裝的統一的Laravel返回數據類namespace App\Library;class Response{const OK 0;const BAD_REQUEST 1000;const PARAM_ERROR 1001;const SQL_ERROR 4000;const FORBIDDEN 4003;const SERVER_ERROR 5000;public static $errMsg [self::BAD_REQUEST > 請求錯誤,self:…

python3連接數據庫步驟_Python3連接Mysql8.0遇到的問題及處理步驟

最近在使用Python開發系統,需連接mysql數據庫,我用的是Python3連接MySQL8.0,其中老是報錯以下問題:網上給了各種各樣的方法,大多是通過各種方式修改密碼。最簡單的方法是更換了root密碼的認證方式解決的,新…

360手柄搖桿漂移修復_徹底解決你的Switch手柄搖桿問題,最省錢的完美修復。

我想很多Switch的消費者都遇到了一個問題,用久了之后的手柄失靈,移動不精準,卡頓,自動位移等現象。玩個游戲都非常的糟心。動一下搖桿角色都會自動移動...這些問題的出現主要原因是搖桿內部進了灰塵,才導致各種現象的出…

libzdb 連接mysql,數據庫連接池庫libzdb使用教程

Libzdb挺強大, 支持Mysql Oracle SQLite PostgreSQL,支持C和C Object C,不能在Window下用(看源碼是因為基于Linux線程機制編寫實現)。遺憾的是找個資料太費勁,只能到Libzdb官網:點此進入 ,今正看著上面英文…

請給出計算231-1的python表達式_【填空題】計算2 32 -1的Python表達式可以書寫為____...

【填空題】計算2 32 -1的Python表達式可以書寫為____更多相關問題【判斷題】軍隊和國防建設指導思想實行戰略轉變的實質是:從立足于早打、大打、打核戰爭的臨戰準備狀況,轉到和平時期建設的軌道上來。【單選題】社會學家認為,一門專業必須具有專業特征,護理專業的特征是( )A. 滿…

數值分析方程求根實驗matlab,數值分析實驗之非線性方程求根(MATLAB實現)

一、實驗目的1. 了解一般非線性方程的求根是比較復雜的事情:要討論(或知道)它有無實根,有多少實根;知道求近似根常用的幾種方法,每種方法的特點是什么。2. 用通過二分法(區間半分法)、不動點(也Picard)迭代…

python多線程輸出_萌新python多線程

剛開始學習多線程的時候鬧了個笑話在使用python線程打印東西的時候發現自己定的的線程數據沒有打印,找半天都沒有找到問題,也沒好意思問,自己憋了半天才發現問題!代碼如下:import threadingdef SayHi():print(say hi !)def SeyHello():print(say hello !)print(start)threading…

php5.6擴展編寫,php 5.6版本中編寫一個PHP擴展的簡單示例

php 5.6版本中編寫一個PHP擴展的簡單示例這篇文章主要介紹了php 5.6版本中編寫一個PHP擴展的簡單示例,本文給出擴展實現代碼、編譯方法、配置方法和使用例子等內容,需要的朋友可以參考下有時候在php本身沒有滿足需求的api時候,需要自己寫相應的擴展,擴展…

iis php 數據庫亂碼,如何解決php插入數據亂碼問題

php插入數據亂碼的解決辦法:首先要設置數據表的字符集為utf8;然后修改字符集格式;接著建立字符集為utf-8的數據庫;最后通過php mysql語句插入數據即可。mysql數據庫亂碼問題解決辦法我們在使用數據庫(mysql)的時候最怕的就是數據庫…

python 文檔字符串_新款Python文檔字符串生成器來了

又一款懶人神器問世了:Visual Studio Code的擴展,基于CodeBERT的Python文檔字符串生成器。看來現在,這群偷「懶」的程序員們連文檔字符串都不想自己寫了。基于CodeBERT的生成器跟正常的DocStrings用法一樣,你只需要輸入三引號「“…

php 棧實現歷史記錄后退,棧:如何實現瀏覽器的前進和后退功能

受限制的線性表先進后出實現一個棧數組實現叫順序棧public class ArrayStack {private String[] items;//存儲數據的數組private int count;//棧中的元素private int n;//棧的大小public ArrayStack(int n){this.items new String[n];this.n n;this.count 0;}//入棧操作publ…

vc 通過句柄修改窗口大小_VC應用(1)通過VC修改銷售訂單行項目的字段

VC是SAP中非常重要的功能,過去多年來,我參與了不少使用VC的項目,我將通過多篇文章介紹VC的一些應用,本文介紹通過VC修改銷售訂單行項目的字段01 概覽在銷售訂單創建時,對于可配置物料來說,不同的配置可能會…

mysql增加實例,MySQL的簡單使用筆記:增加實例以及啟動

增加實例增加實例這里指的的在源碼編譯安裝完MySQL之后建立一個初始的數據庫實例,占用某一端口,或者是使用新端口啟動新的mysqld進程。MySQL需要一些基礎的數據庫以及表來完成基本的設定,比如控制連接的mysql.user表:123456789101…

springboot starter工作原理_98,談談SpringBoot的工作原理

對技術的探索,一切源于好奇心,保持好奇心,才能讓人更年輕。至今,我們已經有了很多創建SpringBoot項目的經驗,比如我們要創建一個支持web開發的項目,我們只需要引入web-starter模塊即可。那么,Sp…

精英主義 遺傳算法 matlab,遺傳算法優化 - osc_lfs4vsih的個人空間 - OSCHINA - 中文開源技術交流社區...

1.遺傳算法簡介遺傳算法是一種基于自然選擇和群體遺傳機理的搜索算法,它模擬了自然選擇和自然遺傳過程中的繁殖、雜交和突變現象.再利用遺傳算法求解問題時,問題的每一個可能解都被編碼成一個“染色體”,即個體,若干個個體構成了群體(所有可能解).在遺傳算法開始時,總是隨機的產…

python 類靜態屬性_如何從Python中的類中引用靜態屬性?

您面臨的問題是因為您不了解類聲明的作用域是如何工作的。類聲明在其自己的作用域內執行。執行完成后,將創建一個新的類對象,并將獲得的范圍作為其__dict__附加到該類。在注意:類范圍是從方法范圍內搜索的而不是!這意味著當在方法…

php后臺管理員登錄密碼錯誤,如果后臺管理員的密碼錯誤,我該怎么辦,還有兩種找回密碼的方法...

Dedecms是中國著名的網站管理核心. 由于編織夢想簡單易用,因此可以進行二次開發,并且可以實現各種網站. 在使用dedecms的過程中,如果忘記了夢想管理后臺的密碼怎么辦?神山個人博客分享了兩種修改(重置)管理員密碼的方法.1. 下載織…