问题是,这些软件包是否应该知道如何自行安装,或者只是向一般安装程序提供信息。这取决于哪些程序最常见,在两个平台上安装相同的包或在同一平台上安装两个包。
在这两种情况下,我都会推荐策略模式
平台运营为战略
什么时候用这个
- 给定包必须执行的操作(几乎)跨平台相同
- 同一平台上的不同软件包具有不同的安装过程。
为每个包类提供一个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);
}
}
使用包作为策略,将使你的包类很短——几乎只有吸气剂。另一方面,对于给定的平台,您必须遵循严格的安装程序,所以它不是那么灵活