设计模式实例讲解 - 依赖倒置
说明
依赖反转原则
依赖于抽象层,不依赖于具体。
即高层次的模块不应该依赖于低层次的模块。
不好的示例
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 协议》,转载必须注明作者和本文链接
推荐文章: