策略模式可以用來建立可插入,可替換,可重用的元件。
先寫乙個沒有用策略模式的例子:
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女生 硬編碼 當需求改變時所有 都需要改變,這種情況就需要使用 策略模式因為策略模式 跟上下文的環境是中立的沒有依...