Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 选择不同数据库的设计模式_Javascript_Node.js_Oop_Design Patterns - Fatal编程技术网

Javascript 选择不同数据库的设计模式

Javascript 选择不同数据库的设计模式,javascript,node.js,oop,design-patterns,Javascript,Node.js,Oop,Design Patterns,我创建了一个类来与我的数据库交互: class MyDatabase { connect() { /* ... */ } } 数据库有两种模式:管理模式和客户端模式。我希望每种模式都有不同的课程: class MyDatabaseAdmin {} class MyDatabaseClient {} 它们都将实现相同的接口,但具有不同的下划线实现。我想知道是否有一个设计模式可以实例化父数据库MyDatabase,选择其中一个。比如: const db = new MyDatabase({

我创建了一个类来与我的数据库交互:

class MyDatabase {
  connect() { /* ... */ }
}
数据库有两种模式:管理模式和客户端模式。我希望每种模式都有不同的课程:

class MyDatabaseAdmin {}

class MyDatabaseClient {}
它们都将实现相同的接口,但具有不同的下划线实现。我想知道是否有一个设计模式可以实例化父数据库
MyDatabase
,选择其中一个。比如:

const db = new MyDatabase({ mode: 'admin' })
db.connect() // parent calls MyDatabaseAdmin.connect
我不需要一个完美的答案,只需要一些我应该寻找的方向


谢谢。

你会考虑只有'<强>用户< /强>吗?然后每个用户可以有一个“角色”,该角色可以是“用户”或“管理员”。因此,基于该“角色”,您将为每个用户定义权限。我发现这种解决方案对于这类东西更容易,但是如果它不符合您的情况,请告诉我。

如果它们没有共同的代码,那么它们实际上只是两个独立的类。您可能甚至不希望管理代码出现在浏览器中,因为它无论如何都不能在那里使用

您可以使用一个工厂函数来查看管理参数并实例化相应的数据库对象并返回它,但我甚至不明白您为什么要这么做

只需让每个客户机实例化适当的DB对象。如果有任何公共代码,您可以让两个实现都从公共基类继承,并将公共代码放入基类中


对!!我忘了提到,但是有一些常见的代码。。。例如,连接和身份验证完全相同。你知道有什么设计模式适合这个用例吗?我应该研究一下工厂吗

我认为一个带有继承的公共基类解决了这里的问题。它为您提供了一个放置公共代码的自然位置,而不必在客户端实现中包含服务器端代码。浏览器实现和服务器实现都是一个子类,仅存在于各自的平台上。公共基类将出现并在这两个地方使用


您只需要让客户端实例化适当的叶类,共享代码就存在于基类中。如果您想隐藏实际的类构造函数,可以使用工厂函数(它只是一个简单的函数,可以查看条件并为您生成适当的对象并返回),但我不确定这里是否有任何令人信服的理由使用工厂函数。您只需要将适当的叶类包含在预期的平台上,这样就没有地方可以在同一代码中使用其中一个。

这两个不同之处是什么?为什么不将属性“mode”添加到原始db类中?我不清楚为什么需要不同的类来管理或常规。如果
admin
只是有更多的特性/方法,那么将常规数据库子类化以进行管理访问。如果登录时,
admin
只是一个选项,而接口在其他方面是相同的,那么只需将其作为任何方法所需的参数即可。这两个类的API表面相同,但它们的实现完全不同。例如,客户机数据库要在浏览器上运行,它使用IndexDB作为缓存层,而另一个数据库没有这样的概念。这只是一个例子,还有其他区别如果它们没有共同的代码,那么它们实际上只是两个独立的类。您可能甚至不希望管理代码出现在浏览器中,因为它无论如何都不能在那里使用。您可以使用一个工厂函数来查看管理参数并实例化相应的数据库对象并返回它,但我甚至不明白您为什么要这么做。只需让每个客户机实例化适当的DB对象。如果有任何公共代码,您可以让两个实现都从公共基类继承,并将公共代码放入基类中。对!我忘了提到,但是有一些常见的代码。。。例如,连接和身份验证完全相同。你知道有什么设计模式适合这个用例吗?我应该研究工厂吗?并不是因为两个类的API表面相同,而是它们的实现完全不同。这不仅仅是关于安全规则,尽管这是原因之一。例如,客户机数据库要在浏览器上运行,它使用IndexDB作为缓存层,而另一个数据库没有这样的概念。