问题是,这些软件包是否应该知道如何自行安装,或者只是向一般安装程序提供信息。这取决于哪些程序最常见,在两个平台上安装相同的包或在同一平台上安装两个包。
在这两种情况下,我都会推荐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。另一方面,对于给定的平台,您必须遵循严格的安装程序,所以它不是那么灵活