PHP之外觀模式

来源:http://www.cnblogs.com/feifeifanye/archive/2017/12/19/8068327.html
-Advertisement-
Play Games

外觀(Facade)模式 當使用子系統的代碼時,你也許會發現自己過於深入地調用子系統的邏輯代碼。如果子系統代碼總是在不斷變化,而你的代碼卻又在許多不同地方與子系統代碼交互,那麼隨著子系統的發展,你也許會發現維護代碼變得非常困難。 在項目中集成複雜的第三方代碼,或在系統中逐漸形成大量僅在系統自身內部有 ...


外觀(Facade)模式

當使用子系統的代碼時,你也許會發現自己過於深入地調用子系統的邏輯代碼。如果子系統代碼總是在不斷變化,而你的代碼卻又在許多不同地方與子系統代碼交互,那麼隨著子系統的發展,你也許會發現維護代碼變得非常困難。

在項目中集成複雜的第三方代碼,或在系統中逐漸形成大量僅在系統自身內部有用的代碼,在這些情況下,你總可以應用外觀模式,為複雜的系統創建一個簡單、清晰的介面。

假設有下麵一段很亂的代碼,其功能是從文件中獲取log信息並將它轉換為對象:

function getProductFileLines($file)
{
    return file($file);
}

function getProductObjectFromID($id, $productname)
{
    // 一些資料庫查詢
    return new Product($id, $productname);
}

function getNameFromLine()
{
    if (preg_match("/.*-(.*)\s\d+/"), $line, $array) {
        return str_replace('_', ' ', $array[1]);
    }
    return '';
}

function getIDFromLine($line)
{
    if (preg_match("/^(\d{1,3})-/", $line, $array)) {
        return $array[1];
    }
    return -1;
}

class Product()
{
    public $id;
    public $name;
    public __construct($id, $name)
    {
        $this->id = $id;
        $this->id = $name;
    }
}

我們的目的是將包含類似下麵數據的文件轉換為一個對象數組:

 234-ladies_jumper 55
 532-gents_hat 44

客戶端使用該功能時要調用所有的方法:

$lines = getProductFileLines('text.txt');
$objects = array();
foreach ($lines as $line) {
    $id = getIDFromLine($line);
    $name = getNameFromLine($line);
    $objects[$id] = getProductObjectFromID($id, $name);
}

如果在項目中直接調用這些方法,那麼我們的代碼會和子系統緊緊耦合在一起。當子系統變化時,或者我們決定將其與子系統完全斷開時,代碼就會出問題。

下麵這個簡單的類為上面的過程式代碼提供了一個介面:

class ProductFacade
{
    private $products = array();
    
    function __construct($file)
    {
        $this->file = $file;
        $this->compile();
    }

    private function complie()
    {
        $lines = getProductFileLines($this->line);
        foreach ($lines as $line) {
            $id = getIDFromLine($line);
            $name = getNameFromLine($line);
            $this->products[$id] = getProductObjectFromID($id, $name);
        }
    }

    function getProducts()
    {
        return $this->products;
    }

    function getProduct($id)
    {
        return $this->product[$id];
    }
}

現在,從一個log文件訪問Product對象就簡單多了:

$facade = new ProductFacade('test.txt');
$facade->getProduct(234);

外觀模式的好處:(1)對於調用者來說,訪問代碼變得簡潔、非常方便.(2),由於只在一個地方調用子系統,減少了出錯的可能.(3),Facade類還能使調用者避免不正確地使用內部方法,從而減少錯誤的發生。

註1:這是《深入PHP:面對對象、模式與實踐》第十章的部分內容(其他的都看不懂,逃~)
註2:此文章也可以在我單獨的博客裡面看到: https://feiffy.cc/%E3%80%8A%E6%B7%B1%E5%85%A5PHP%EF%BC%9A%E9%9D%A2%E5%AF%B9%E5%AF%B9%E8%B1%A1%E3%80%81%E6%A8%A1%E5%BC%8F%E4%B8%8E%E5%AE%9E%E8%B7%B5%E3%80%8B#.E5.A4.96.E8.A7.82.28Facade.29.E6.A8.A1.E5.BC.8F


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、前言 PHP加密方式分為單項散列加密,對稱加密,非對稱加密這幾類。 像常用的MD5、hash、crypt、sha1這種就是單項散列加密,單項散列加密是不可逆的。 像URL編碼、base64編碼這種就是對稱加密,是可逆的,就是說加密解密都是用的同一秘鑰。 除此外就是非對稱加密,加密和解密的秘鑰不是 ...
  • module定義 對於可復用的函數集,可以對其進行分組,整合到一個或者若幹個.py文件中,而在python中,一個.py文件就叫做一個模塊。變數,函數。 module註意點 為了避免命名衝突,python中引入目錄組織的方式,這裡稱之為包(package) 每個包下都會有一個__init__.py文 ...
  • 一、Java開發環境概述 1、JDK:Java開發工具包(Java Development Kit),包括java編譯器、java運行時環境和常用的類庫 2、JRE:Java運行時環境(Java Runtime Environment) 二、跨平臺特性 1、平臺指的是操作系統(Windows,Lin ...
  • 編者按:README:此代碼為用戶登陸界面,添加了尋求幫助選項。1.學習了基本數據類型,string, int,以及while迴圈,continue, break, if, elif, else條件語句,“x".format(x)變數替代2.上網搜的dictionary用法,由於用的是python3 ...
  • 學而不思則罔,思而不學則殆。 mybatis 增刪改查,用到了MyEclipse中自帶的Junit4做單元測試,沒啥難度,作為練習。關於jar包和目錄結構請參考上一篇,這裡直接上代碼。 下一篇會寫關於配置文件優化,聯合查詢,以及使用註解的方式,客官們不要著急! ...
  • IO位元組輸入輸出流 OutputStream:位元組輸出流 該抽象類是所有位元組輸出流的超類; 定義了一些共性的成員方法: 1.寫入一個位元組 2.寫入位元組數組 3.寫入位元組數組的一部分 4.刷新輸出流,並強制寫出所有緩衝的輸出位元組 5.關閉輸出流並釋放與之有關的所有系統資源 FileOutputStre ...
  • python 介紹 一、簡介 Python(英國發音:/ˈpaɪθən/ 美國發音:/ˈpaɪθɑːn/),是一種廣泛使用的高級編程語言,屬於通用型編程語言,由Guido van Rossum 創造,第一版發佈於 1991 年。作為一種解釋型語言,Python 的設計哲學強調代碼的可讀性和簡潔的語法 ...
  • 第一種:利用eclipse中自帶的export功能 第一種方法分兩種情況先來看第一種情況:沒有引用外部jar的項目打包 步驟一:右鍵點擊項目選擇導出(export),選擇java>jar文件(不是選擇可運行jar文件) 步驟二:選擇你要導出的項目以及文件,指定文件導出路徑。連續點擊兩個下一步後到第四 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...