PHP學習記錄 策略模式

2021-06-21 09:47:26 字數 4166 閱讀 9473

策略模式可以用來建立可插入,可替換,可重用的元件。

先寫乙個沒有用策略模式的例子:

lesson.class.php:

<?php

//課程類

class lesson

//返回購買課程所需的費用

public function cost()

}//返回購買課程的名稱

public function coursetype()}}

?>

lesson.php:

<?php

require 'lesson.class.php';

$_lesson = new lesson(5,lesson::english);

echo $_lesson->coursetype().',總共花費了'.$_lesson->cost().'元';

echo '

'; $_lesson = new lesson(5,lesson::math);

echo $_lesson->coursetype().',總共花費了'.$_lesson->cost().'元';

?>

考慮第乙個問題:是否可重用?   很明顯上述**是不可重用的,都是單獨呼叫。

考慮第二個問題:是否可插入?   如果我們此時再加入一門新的課程,必須往主類中新增額外的**,違反了高內聚,低耦合的原則,所以上述**也不可怎麼容易插入。

考慮第桑個問題:是否可替換?   如果將english改為chinese的話,那麼lesson.php中也要修改,有english的地方都要進行修改,造成連鎖反應,所以替換也不行。

當專案不斷擴充套件時,它的修改和維護會非常艱難。下面我們來再用繼承的方式修改一下上述的**:

lesson.class.php:

<?php

//抽象課程類

abstract class lesson

//返回購買課程所需的費用

abstract public function cost();

//返回購買課程的名稱

abstract public function coursetype();

}?>

english.class.php:

<?php

class english extends lesson

public function coursetype()

}?>

math.class.php:

<?php

class math extends lesson

public function coursetype()

}?>

lesson.php:

<?php

require 'lesson.class.php';

require 'english.class.php';

require 'math.class.php';

$_english = new english(5);

echo $_english->coursetype().',總共需要花費'.$_english->cost();

echo '

'; $_math = new math(5);

echo $_math->coursetype().',總共需要花費'.$_math->cost();

?>

如果我們此時想要增加一門新的課程,就不需要再在主類中做任何修改了。只需要再增加乙個新的類就行。

現在我們再來進一步使用策略模式來代替繼承,因為在以後的擴充套件和維護中,策略模式要優於繼承。

策略模式的組成:   1.策略類,通常由乙個介面或抽象類來實現   2.具體的策略角色:包裝了相關的演算法和行為  3.環境角色:持有乙個策略類的引用,最終給客戶端呼叫。

lesson.class.php:

<?php

//課程類

class lesson

//***

public function __get($key)

//返回具體策略角色課程所需要的費用

public function cost()

//返回具體策略角色購買課程的名稱

public function coursetype()

}?>

english.class.php:

<?php

class english

public function coursetype()

}?>

math.class.php:

<?php

class math

public function coursetype()

}?>

lesson.php:

<?php

require 'lesson.class.php';

require 'english.class.php';

require 'math.class.php';

//通過不同的引數來改變不同的課程的行為,這種方法實現了類切換,類切換就是多型

$_lesson = new lesson(5,new math());

echo $_lesson->coursetype().',總共花費了'.$_lesson->cost().'元';

echo '

'; $_lesson = new lesson(5,new english());

echo $_lesson->coursetype().',總共花費了'.$_lesson->cost().'元';

?>

以上的**並不是完全角態的策略模式,下面來看進一步改進後的形式:

我們為子類新增乙個父類來統一規範子類:

lesson.class.php:

<?php

//課程類

class lesson

//***

public function __get($key)

//返回具體策略角色課程所需要的費用

public function cost()

//返回具體策略角色購買課程的名稱

public function coursetype()

}?>

superclass.class.php:

<?php

abstract class supercourse

?>

math.class.php:

<?php

class math extends supercourse

public function coursetype()

}?>

english.class.php:

<?php

class english extends supercourse

public function coursetype()

}?>

lesson.php:

<?php

require 'lesson.class.php';

require 'supercourse.class.php';

require 'english.class.php';

require 'math.class.php';

//通過不同的引數來改變不同的課程的行為,這種方法實現了類切換,類切換就是多型

$_lesson = new lesson(5,new math());

echo $_lesson->coursetype().',總共花費了'.$_lesson->cost().'元';

echo '

'; $_lesson = new lesson(5,new english());

echo $_lesson->coursetype().',總共花費了'.$_lesson->cost().'元';

?>

這就是乙個比較正宗的策略模式-。-

PHP策略模式

個人覺得設計模式只有在實際應用中才能夠慢慢的去熟悉,到最後做到心中有模式,事事有模式,哈哈 例如 乙個電商首頁,可以根據登陸使用者的性別不同顯示不同的內容,比如廣告和商品類別。傳統方法 在程式內部使用多個if,else進行判斷,這樣很難維護,比如我想要再加入乙個人妖使用者!那麼我就要在程式中再加入e...

PHP 策略模式

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

php 設計模式(策略模式)

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