【问题标题】:Matrix-like inheritance pattern类矩阵继承模式
【发布时间】:2013-10-31 09:03:11
【问题描述】:

我正在寻找一种我称之为矩阵继承的设计模式。为了更好地解释这个问题,我将描述一个例子。

鉴于我想以一般方式对 (linux) 系统包进行建模。我有一个名为Package 的基类,它是Apache2PHP5 等派生类。现在这些类包含所有方法,以确保按照我希望的方式安装和配置这些包。但是这些类应该可以在几个不同的操作系统上使用,比如 Debian、Ubuntu、Fedora、CentOS、其他 Linux 发行版和(如果可能的话)Windows。

在我看来,这可以通过某种继承矩阵来解决,其中有效类从基包类继承(包括混合)以提供基础方法和混合以扩展和/或覆盖来自其他类的方法/modules/interfaces/protocols 最终提供在用于混入的特定系统上自动安装的功能。

我正在尝试用 ruby​​ 构建它,但我更感兴趣的是应用于系统以实现这一点的通用设计模式。

此外,我确信已经有一个现有的设计模式或这些设计模式的组合可以得到我想要的,我似乎无法自己找到解决这个问题的干净解决方案。

作为额外的奖励(甚至是替代方案),我想知道使用功能的观点而不是面向对象的方法是否更容易解决问题,以及这会是什么样子。

【问题讨论】:

  • 在我看来,这是一个很好的组合,而不是继承。

标签: design-patterns inheritance mixins


【解决方案1】:

问题是,这些软件包是否应该知道如何自行安装,或者只是向一般安装程序提供信息。这取决于哪些程序最常见,在两个平台上安装相同的包或在同一平台上安装两个包。

在这两种情况下,我都会推荐Strategy Pattern

平台运营作为战略

什么时候用这个

  • 给定包必须执行的操作(几乎)跨平台相同
  • 同一平台上的不同软件包具有不同的安装过程。

为每个包类提供一个Platform 类。该类将作为一种策略模式,并为您的类提供不同平台的操作,例如:

(对不起,代码是在java中。我不知道ruby :()

interface Platform {
  File getInstallDir()
}

class PHP5 {
  private Platform platform;
  public PHP5(Platform platform) {
    this.platform = platform
  }
  public void install() {
     // Let the platform provide information
     File destDir = platform.getInstallDir()
     ...
  }
}

或者:

interface Platform {
  void copyPackageFiles(File[] files)
}

class PHP5 {
  private Platform platform;
  private File[] php5Files = ...
  public PHP5(Platform platform) {
    this.platform = platform
  }
  public void install() {
     // Let the perform perform specific tasks
     platform.copyPackageFiles(php5Files);
     ...
  }
}

这种方法是两种方法中最灵活的一种,但很可能会让您编写更多样板代码。

包作为策略

在以下情况下使用它:

  • 同一平台上的不同软件包具有(几乎)相同的安装过程。
  • 给定包必须执行的操作因平台而异

这与其他模式非常相似,只是颠倒了。在此您将使用Package 作为策略并将其传递给控制安装过程的Platform

interface Package {
  File[] getFiles();
  Properties getProperties();
}

class Ubuntu {
  public installPackage(Package package) {
    // Use the package to provide input for you operations:
    copyFiles(package.getFiles());
    updateConfiguration(package.getProperties);
  }
}

使用包作为策略,将使你的包类更短——几乎只有 getter。另一方面,对于给定的平台,您必须遵循严格的安装程序,所以它不是那么灵活

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多