策略模式(講解依賴倒置,控制反轉(zhuǎn),依賴注入)
在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執(zhí)行算法。
我們簡單來理解策略模式,假設(shè)我們設(shè)計一個機(jī)器人,我們對于不同的國家設(shè)計出不同的語言模塊,這個語言模塊就是一個策略。當(dāng)我們要出廠一個機(jī)器人的時候,一開始我們的設(shè)計:
//機(jī)器人說話模塊抽象
interface IRobot
{
function speak();
}
//中文說話模塊
class ChinaRobet implements IRobot
{
//override
static function speak(){
echo '你好';
}
}
//日文說話模塊
class JapanRobet implements IRobot
{
//override
static function speak(){
echo 'こんにちは';
}
}
//機(jī)器人
class Robot
{
//說話方法
function speak(){
if($_GET['China']){
ChinaRobet::speak();
}else if($_GET['Japan']){
JapanRobot::speak;
}
}
}
$robot = new Robot();
$robot->speak();
這樣,這個出廠的機(jī)器人就擁有了說話的能力。但是呢,由于在每個設(shè)定的時候,都要帶上兩個國家說話模塊,(依賴兩個類),這樣就增加了耦合,并且機(jī)器人高層次的依賴于低層次的說話模塊?,F(xiàn)在我們改一下這個模塊:
//機(jī)器人
class Robot
{
protect $speakModel;
//說話方法
function speak(){
$this->speakModel->speak();
}
function setModel(IRobot $speakModel)
{
$this->speakModel = $speakModel;
}
}
if($_GET['China']){
$speakModel = new ChinaRobot();
}else if($_GET['Japan']){
$speakModel = new JapanRobot();
}
$robot = new Robot();
$robot->setModel($speakModel);
$robot->speak();
這樣的話,在機(jī)器人設(shè)定的時候,我們不依賴于他底層的模塊,只是設(shè)定他抽象出來說話的功能。
這樣,你裝載了什么模塊,機(jī)器人就在說話功能時做出不一樣的處理。這樣機(jī)器人就不依賴于底層的模塊,只去按照抽象接口去實現(xiàn)自己的方法。這就是依賴倒置。
當(dāng)Robot內(nèi)部不再需要實例化兩個語言模塊,自己只關(guān)心依賴提供的方法,這就是控制反轉(zhuǎn)。以前是Robot類要實例化并且操作兩個語言包,現(xiàn)在只需要實現(xiàn)自己的功能就好了。
依賴注入就更簡單啦,你裝上模塊,將robot依賴的模塊通過參數(shù)傳遞進(jìn)來的方式就是注入。依賴注入