为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

料青山看我应如是 2022-05-22 16:15:51
我创建了一个类来与我的数据库交互:class MyDatabase {  connect() { /* ... */ }}并且数据库有两种模式:admin和client。我想为每种模式设置不同的类:class MyDatabaseAdmin {}class MyDatabaseClient {}它们都将实现相同的接口,但具有不同的下划线实现。我想知道是否有一种设计模式来实例化父MyDatabase级选择一个而不是另一个。就像是:const db = new MyDatabase({ mode: 'admin' })db.connect() // parent calls MyDatabaseAdmin.connect我不需要一个完美的答案,只需要一些我应该寻找的方向。
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

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

您可以有一个工厂函数来查看管理参数并实例化适当的数据库对象并返回它,但我认为我什至不明白您为什么要为此烦恼。

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

对!我忘了提,但是有一些通用代码……例如,连接和身份验证完全相同。您是否碰巧知道任何非常适合此用例的设计模式?我应该研究工厂吗?

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

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


查看完整回答
反对 回复 2022-05-22
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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



查看完整回答
反对 回复 2022-05-22
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信