說明
依賴反轉原則
依賴於抽象層,不依賴於具體。
即高層次的模組不應該依賴於低層次的模組。
不好的示例
PasswordReminder
類用於實現密碼提醒
class PasswordReminder {
/**
* @var MySQLConnection
*/
private $dbConnection;
public function __construct(MySQLConnection $dbConnection)
{
$this->dbConnection = $dbConnection;
}
}
該類中,還需要實現 MySQL
連線,才能夠實現密碼提醒功能。即高層次的「密碼提醒功能」就依賴於具體的低層次模組「資料庫連線」。違反了依賴反轉原則。
改進
我們可以反轉上面的依賴關係:
- 原始邏輯:資料庫連線 → 密碼提醒
- 反轉:密碼提醒 → 資料庫連線
首先,我們先設計好密碼提醒功能,不考慮具體的資料庫連線實現,只需要依賴於抽象的介面
class PasswordReminder {
/**
* @var ConnectionInterface
*/
private $dbConnection;
public function __construct(ConnectionInterface $dbConnection)
{
$this->dbConnection = $dbConnection;
}
}
interface ConnectionInterface {
public function connect();
}
接著,我們根據需要去實現對應的資料連線
class DbConnection implements ConnectionInterface {
public function connect()
{
// connect
}
}
高層次依賴於抽象,不去關心具體的實現細節,把細節交給低層次來實現,這樣就能夠實現解耦。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
點選 連結,加入心智極客的技術分享知識星球