类似矩阵的继承模式

时间:2013-10-22 13:06:50

标签: design-patterns inheritance mixins

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

在这两种情况下,我都会推荐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。另一方面,您必须遵循给定平台的严格安装过程,因此它不是那么灵活