設計模式例項講解 - 依賴倒置

心智極客發表於2020-01-04

說明

依賴反轉原則

依賴於抽象層,不依賴於具體。

即高層次的模組不應該依賴於低層次的模組。

不好的示例

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 協議》,轉載必須註明作者和本文連結

點選 連結,加入心智極客的技術分享知識星球

相關文章