我有两个网站具有几乎相同的数据库架构。唯一的区别是一个网站中的一些表格有另外一个或两个字段,反之亦然。适用于几乎相似对象的优秀设计模式
我想要相同的数据库访问层类来操纵这两个网站。
什么可以是一个很好的设计模式,可以用来处理这种微小的差异。
例如,我有一个方法createAccount(Account account)
在我的DAO类,但实施将是一个网站和网站B.
我有两个网站具有几乎相同的数据库架构。唯一的区别是一个网站中的一些表格有另外一个或两个字段,反之亦然。适用于几乎相似对象的优秀设计模式
我想要相同的数据库访问层类来操纵这两个网站。
什么可以是一个很好的设计模式,可以用来处理这种微小的差异。
例如,我有一个方法createAccount(Account account)
在我的DAO类,但实施将是一个网站和网站B.
之间略有不同。如果对象的实现也将是几乎相同的,我会建议使用抽象基类。通过继承扩展类,并确保不知道扩展字段的函数需要基类而不是派生类。
class MercedesBenzC300 : Car
{
int brake();
void TurnOnRadio();
}
class MercedesBenzC300Business : MercedesBenzC300
{
int EnableCruiseControl();
}
因此,在这个例子中,我们有两辆车,其几乎是完全一样的,但是,一个是商业版,因此具有巡航CONTROLE。所有不与巡航控制相互作用的功能也可以将其视为普通汽车。只有那些应该使用巡航控制的人现在应该得到派生类。
很少有细节说一些具体的东西,但我会尝试。它取决于形势的复杂性,但你可以很乐意与简单的参数化是切换上的功能/关:
class AccountRepository:
def constructor(have_feature_a, have_feature_b, etc):
# ...
def create_account(account):
if have_feature_a:
# do something special
# do common operations
if have_feature_b:
# do another special thing
这工作得很好,如果你有几个这样的特点,他们在几行代码做的非常小的东西(可表示)。如果其中一些功能很重,可以将它们封装在具有已知接口的独立类中。这就是所谓的策略模式。然后这个策略被注入AccountRepository
作为依赖。这被称为DI或依赖注入:
class AccountRepository:
def constructor(have_feature_a, feature_b_worker, etc):
# ...
def create_account(account):
if have_feature_a:
# do something special
# do common operations
if feature_b_worker != null:
# line bellow runs heavy code encapsulated in strategy
feature_b_worker.do_work(account)
现在,你甚至可以有多个FeatureB实现,并使用其中任何一个针对不同的情况。例如。一个用于测试,一个用于生产。