设计模式实例讲解 - 依赖倒置

说明

依赖反转原则

依赖于抽象层,不依赖于具体。

即高层次的模块不应该依赖于低层次的模块。

不好的示例

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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!