0

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

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

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

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

另外我确信已经有一个现有的设计模式或它们的组合来获得我想要的东西,我似乎无法自己找到解决这个问题的干净解决方案。

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

4

1 回答 1

0

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

在这两种情况下,我都会推荐策略模式

平台运营为战略

什么时候用这个

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

为每个包类提供一个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);
  }
}

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

于 2013-10-23T21:01:31.403 回答