【问题标题】:A good design pattern for almost similar objects几乎相似对象的良好设计模式
【发布时间】:2010-04-02 18:39:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: perl oop design-patterns


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      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)
      

      现在您甚至可以拥有多个 Fe​​atureB 实现,并将它们中的任何一个用于不同的情况。例如。一个用于测试,一个用于生产。

      【讨论】:

        猜你喜欢
        • 2020-01-13
        • 1970-01-01
        • 2017-12-04
        • 2010-12-29
        • 1970-01-01
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多