几乎相似物体的良好设计模式

时间:2010-04-02 18:39:06

标签: perl oop design-patterns

我有两个网站具有几乎相同的数据库架构。唯一的区别是,一个网站中的某些表格有另外一个或另外两个字段,反之亦然。

我希望使用相同的数据库访问层类来操纵这两个网站。

可以用来处理这种微小差异的好设计模式。

例如,我的DAO类中有一个方法createAccount(Account account),但网站A和网站B之间的实现略有不同。

2 个答案:

答案 0 :(得分:1)

如果对象的实现也几乎相同,我建议使用抽象基类。通过继承扩展类,并确保不知道扩展字段的函数需要基类而不是派生类。

class MercedesBenzC300 : Car
{
     int brake();
     void TurnOnRadio();
}

class MercedesBenzC300Business : MercedesBenzC300
{
    int EnableCruiseControl();
}

所以在这个例子中我们有两辆几乎完全一样的车,但是,一辆是商业版,所以它有巡航控制器。所有不与巡航控制系统交互的功能也可以将其视为普通汽车。只有那些应该使用巡航控制的人才应该获得派生类。

答案 1 :(得分:0)

说些具体细节的细节太少,但我会试试。这取决于情况的复杂性,但您可以对简单的参数化感到满意,该参数化可以打开/关闭功能:

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实现,并将其中任何一个用于不同的情况。例如。一个用于测试,一个用于生产。