PHP策略模式

2021-07-11 07:11:32 字數 2252 閱讀 9790

個人覺得設計模式只有在實際應用中才能夠慢慢的去熟悉,到最後做到心中有模式,事事有模式,哈哈

例如:乙個電商首頁,可以根據登陸使用者的性別不同顯示不同的內容,比如廣告和商品類別。

傳統方法:在程式內部使用多個if,else進行判斷,這樣很難維護,比如我想要再加入乙個人妖使用者!那麼我就要在程式中再加入else if判斷,這樣寫出來的程式看起來很亂,而且不易維護。

策略模式:

實現的思想是這樣的,建立乙個介面,對於每個類別的使用者建立乙個類,分別去實現介面中的方法,在首頁進行判斷例項化哪個類。

**如下:

介面檔案userstrategy.php

<?php

//定義介面,我要展示廣告和類別

inte***ce

userstrategy

?>

男性使用者的具體顯示maleuserstrategy.php

<?php

//強制實現介面中的方法

class

maleuserstrategy

implements

userstrategy

//會顯示電子產品類別

public

function

showcategory

()

}?>

女性使用者的具體顯示femaleuserstrategy.php

<?php

class

femaleuserstrategy

implements

userstrategy

public

function

showcategory

()

}?>

重點來了,建立首頁檔案strategy.php

<?php

//如果我想使用上面那些類的話就需要乙個檔案乙個檔案的require,但我們可以使用一種方法來自動載入所需要的檔案

//首先定義乙個基本的檔案路徑,因為這些檔案我都是放在乙個資料夾下的

define('basedir', __dir__);

//載入乙個自動require檔案的檔案,這裡我寫成config.php

require

'config.php';

//php提供的spl庫,這我們就把需要的檔案都載入進來了

//那麼spl_autoload_register()是什麼意思呢?其實就是,當程式執行碰到了沒有定義的類的時候就會自動執行它裡面的函式,所以就把檔案載入近來了呀!

spl_autoload_register('config::autoload');

class

strategy

//建立不同的策略

public

function

setstrategy

($strategy)

}//例項化物件

$strategy = new strategy();

//如果$_get['female']存在的話就顯示女性使用者的廣告和類別--如果需要新增其它策略的時候只需要在這裡加入判斷條件就可以了,當然了還需要建立相應策略的類並且一定要去繼承介面哦

if(isset($_get['female']))

else

//把物件傳入到策略類裡

$strategy = setstrategy($people);

//顯示廣告和類別--因為使用了策略模式,當我們需要新增加乙個策略的時候這裡就不需要修改了。

$strategy->index();

?>

自動引入檔案config.php

<?php

//這裡大家可以看到,我的檔案都是大寫開頭的,而且每個檔案中只有乙個類,並且這個類的名字是和檔名一樣的,其實這是一種框架的規範,大家有興趣的話可以查詢一下,psr-0規範

class

config

}?>

告誡自己在以後的程式設計中多去考慮,熟能生巧。

PHP 策略模式

引言 所屬 行為型模式,常用設計模式之一 學習資料 模式概述 分享一篇關於策略模式講的很好的文章,大家可以參考一下 策略模式就是用來封裝演算法的,但在實踐中,我們發現可以用它來封裝幾乎任何型別的規則,只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。舉...

php 設計模式(策略模式)

策略模式是將一組特定的行為和演算法封裝成類,以適應某些特定的上下文環境,這就是策略模式 電商類 針對男生和女生要跳到不同的商品類目,並且所有廣告位展示不同的廣告 中會出現 if男生 if女生 硬編碼 當需求改變時所有 都需要改變,這種情況就需要使用 策略模式因為策略模式 跟上下文的環境是中立的沒有依...

PHP設計模式 策略模式

其實就是同一方法的不同實現,類似於重寫。和工廠模式有一樣的效果,但是策略模式更注重方法的重寫,尤其是一種方法。工廠模式更注重類的不同,直接導致很多方法的不一樣。abstract class baseagent 用於客戶端是ie時呼叫的類 環境角色 class ieagent extends base...