我发现this关于JS中DIP的文章,我对此有一个很大的疑问。
class Database {
constructor() {
this.items = [];
}
add(item) {
this.items.push(item);
}
get(id) {
return this.items.find((item) => item.id === id);
}
}
class DatabaseInterface {
constructor(database) {
this.database = database;
}
add(item) {
this.database.add(item);
}
get(id) {
return this.database.get(id);
}
}
class UserController {
constructor(databaseInterface) {
this.databaseInterface = databaseInterface;
}
createUser(name) {
const user = { id: Date.now(), name };
this.databaseInterface.add(user);
return user;
}
getUser(id) {
return this.databaseInterface.get(id);
}
}
以上代码解释为:
在这个固定示例中,我们为Database 类创建了一个接口,称为DatabaseInterface。 UserController 类现在依赖于 DatabaseInterface 抽象,该抽象由 Database 类实现。 通过使用抽象,我们反转了依赖关系,现在低级 Database 类依赖于高级 DatabaseInterface 抽象。
我不明白
Database
类如何依赖于DatabaseInterface
。我认为相反 - DatabaseInterface
取决于 Database
,因为 DatabaseInterface
使用 Database
。我说得对吗?
你是对的,严格来说,
Database
类并不依赖于DatabaseInterface
类,但它需要实现它。我认为作者的意思是,需要 Database
来实现 DatabaseInterface
中的方法,并将其称为依赖项。
DatabaseInterface
类依赖于实现database
和add()
的a
get()
。这可能很有用,因为您可以定义另一个依赖于 Foo
的类 DatabaseInterface
,但 Foo
不会依赖于 DatabaseInterface.database
的具体实现,因为您可以提供 database
到 DatabaseInterface
的不同实现,而无需改变Foo
。