PHP設計模式系列之入門

2021-09-18 02:18:56 字數 2886 閱讀 2055

設計模式(design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、**設計經驗的總結。使用設計模式是為了可重用**、讓**更容易被他人理解、保證**可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使**編制真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。

步子邁大了容易扯到蛋,如果在沒有熟悉 oop 程式設計思想前就開始學習設計模式,我感覺會有兩種可能,不是「扯蛋」,就是「拉跨」。

當然上面的話是一句玩笑話,學習設計模式可以有效的提高我們的**質量與深入的理解 oop 程式設計理念,如但是果在沒有紮實的功底(至少要要理解了抽象、介面、多型)前就開始學習設計模式會越學越難,腦子越來越渾,那就真變成了從入門到放棄了,因為你的思維還沒有真正的走進 oop(單身狗表示完全無法物件導向^_^)。

對於設計模式的不理解我感覺主要分為兩種,一種是不知道怎麼實現的,原因就是如上所述,另外一種是不知道為什麼要這麼用的,其實沒有必要糾結於為什麼這麼用,這麼用了有啥作用,設計模式不過是與演算法一樣只是為了實現某個特定環境下可以使用的一種更好的選擇。

更好一點的例子就是當我們對一些資料進行排序的時候,我們首先想到就是那幾個排序演算法一樣,當我們打著打著**突然靈光一閃,好像這個地方用這個設計模式寫起來會輕鬆一點。

當碰到不懂得地方,思考一下,想不通,就出去走走,把這個東西放下來,反正就算看到第二天凌晨也也是無用的,當真正遇到問題的時候,靈光一閃這個東西可以這麼寫,然後去實踐,這就是我的學習之道。還有就是盡量去學例項,而不是去死扣概念,當你真正用起來了,你也就差不多懂了,演算法與資料結構亦是如此。

本系列文章盡量以推導的形式來進行書寫,而不是以現成的**來進行講解,讓讀者知道設計模式是怎麼來的也就是如何演化出來的,希望各位能夠喜歡。另外本系列的文章並不會提供執行介面的截圖,如果想看看結果是否正確,為什麼不自己試試呢?

首先我們想到的是在每乙個廣告位上面都使用 if 判斷來判斷訪客的性別,這樣就能夠解決這樣的需求,那麼我們的每乙個廣告**的**塊可能是這個樣子的:

判斷 男 or 女else
既然偽**想好了,那麼我們就可以著手進行開發了,然後我們在 if **塊中新增各自的家在廣告**,於是就變成了下面的樣子:

if ($_get['***'] == 'man') else
但是這是屬於一種硬編碼的程式設計方式,一旦我們增加了某種需求,要求其年齡大於23歲顯示什麼樣的廣告,那麼我們就不得不在每乙個 if 判斷處再加上新的判斷條件,這樣的設計就是不合理的,為了提高可讀性與可維護性,我們會考慮建立兩個不同的類來對兩個廣告類來對其進行管理。於是**變成了下面的樣子。

include 'genderad.php';

include 'manad.php';

if ($_get['***'] == 'man') else

$ad->show();

class genderad

}class manad

}

algorithm 英[ˈælgərɪðəm] 美[ˈælɡəˌrɪðəm] n. 演演算法; 運算法則; 計算程式;

其實到了這一步就已經算是乙個簡單的策略模式了,因為他已經具有策略的特質了,只不過還不夠完善,如果說這不算什麼的話我也沒有辦法,因為所有的設計模式其實都是思維模式與表現形式罷了,就像上面的引用中提到的一樣,設計模式只不過是為了能夠讓**可以重用,更容易他讓人理解,因為你的**並不是你乙個人在維護,那麼問題來了,只是簡單的對其進行封裝真的就提高**的可維護性了麼,其實並沒有,我們還沒有將 oop 的設計概念發揮到極致。

經過分析我們發現其實 manad類和 genderad最終都要進行顯示,他們的方法的顯示方法都是 show,如果是你乙個人在開發那麼沒有什麼問題,可是若是兩個人開發呢,你們可以直接可以對話的方式進行溝通,協定好都是 show方法來顯示,可是為什麼不用更工程化的方式來實現呢?

我們可以新建乙個介面來對這些策略進行控制。

inte***ce adinte***ce

class manad implements adinte***ce

}class genderad implements adinte***ce

}

這樣一來廣告策略必須遵循這個介面進行開發,就保證了所有策略類都需要實現 show 方法。

到目前為止,策略模式已經相對的完善了,但是還是不夠完美,因為**依舊並不是很 oop,我們其實還可以更進一步,讓他更 oop,我們可以對那些策略外面套乙個殼子,給外面乙個選擇器。

class strategyselect 

public function algorithm($strategy)

}

我們通過建構函式接收到具體的執行策略,然後使用algorithm()執行相對應的策略。

<?php 

inte***ce adinte***ce

class strategyselect

public function algorithm()

}class manad implements adinte***ce

}class genderad implements adinte***ce

}header("content-type:text/html;charset=utf-8");

if ($_get['***'] == 'man') else

strategy其實算是乙個策略選擇器,當滿足一定條件的時候,我們通過這個策略選測器來進行選擇相對應的策略。這樣一來更符合邏輯。是不是很 oop?

我的部落格**:www.aircrayon.xyz,有興趣的朋友可以去看看,不過上面的東西很久沒有更新了,而且有的博文內容不全。

PHP設計模式系列 委託模式

通過分配或委託其他物件,委託設計模式能夠去除核心物件中的判決和複雜的功能性。php view plain copy print?委託模式 去除核心物件中的判決和複雜的功能性 class cd public function play song public function playmp4 song...

PHP設計模式系列 策略模式

策略模式設計幫助構建的物件不必自身包含邏輯,而是能夠根據需要利用其他物件中的演算法。例如有乙個cd類,我們類儲存了cd的資訊。原先的時候,我們在cd類中直接呼叫getcd方法給出xml的結果 隨著業務擴充套件,需求方提出需要json資料格式輸出 這個時候我們引進了策略模式,可以讓使用方根據需求自由選...

PHP設計模式系列 委託模式

通過分配或委託其他物件,委託設計模式能夠去除核心物件中的判決和複雜的功能性。委託模式 去除核心物件中的判決和複雜的功能性 class cd public function play song public function playmp4 song oldcd new cd oldcd addson...