Oop 设计模式:具体实现如何在运行时选择行为?
我对这个术语还不熟悉,所以如果我的问题的任何部分措辞错误,请纠正我 下面是我想到的一个例子: 一个文件同步程序,允许您将两个文件夹配对在一起,并指定选项,如镜像两个文件夹、仅以一种方式复制内容等。Oop 设计模式:具体实现如何在运行时选择行为?,oop,design-patterns,Oop,Design Patterns,我对这个术语还不熟悉,所以如果我的问题的任何部分措辞错误,请纠正我 下面是我想到的一个例子: 一个文件同步程序,允许您将两个文件夹配对在一起,并指定选项,如镜像两个文件夹、仅以一种方式复制内容等。 我如何在运行时指定这些具体实现如何复制文件(例如,不同类型的加密) 以下是我想实现的目标: 我是否必须为每一项都制定具体的实施方案?比如镜子鱼、河豚鱼、单向鱼等?有更好的选择吗 谢谢您有一些正交的问题-同步类型和加密。一种方法是策略模式,其中同步类的具体实现聚合了一个加密类,同步器与加密接口交互,允
我如何在运行时指定这些具体实现如何复制文件(例如,不同类型的加密) 以下是我想实现的目标: 我是否必须为每一项都制定具体的实施方案?比如镜子鱼、河豚鱼、单向鱼等?有更好的选择吗
谢谢您有一些正交的问题-同步类型和加密。一种方法是策略模式,其中同步类的具体实现聚合了一个加密类,同步器与加密接口交互,允许“混合匹配”加密和同步不会对您编写的类的数量产生倍增效应。您的意思是,您需要加密策略吗 使用一个抽象工厂和一组加密策略。如果有多个选项,请使用生成器
比如说,你有一个加密和一个去加密。两者都实现了一个接口,比如说GeneralEncryptionStrategy,并且您有一个EncryptionFactory,它将字符串(“sha1”或“des”)作为参数,并创建相应类的实例。图表的显示方式,您的加密方式似乎取决于您执行同步的方式。我怀疑情况是否如此(尽管我可能错了) 如果同步方式与加密方式完全无关,请从继承切换到合成。使
文件夹对
成为具有同步策略
和加密策略
的对象,如下所示:
class FolderPair {
URI a, b;
private final SyncStrategy syncStrategy;
private final EncryptionStrategy cryptStrategy;
public FolderPair(
URI a
, URI b
, SyncStrategy syncStrategy
, EncryptionStrategy cryptStrategy) {
...
}
public void sync() {
syncStrategy.synchronize(a, b, cryptStrategy);
}
}
interface SyncStrategy {
void synchronize(URI a, URI b, EncryptionStrategy cryptStrategy);
}
interface EncryptionStrategy {
byte[] encrypt(byte[] data);
}
现在,您可以使用SyncStrategy
和EncryptionStrategy
的实例配置FolderPair
对象,混合并匹配它们,而无需创建组合爆炸:
FolderPair p1 = new FolderPair(aUri, bUri, new OneWyaSync(), new AesCrypt());
此设计有两个应用程序,一个用于同步行为,另一个用于加密。太棒了,谢谢!我修改了我的图表,使其看起来像这样:我没有想到要将EncryptionStrategy放入SyncStrategy,即这里的void synchronize(URI a、URI b、EncryptionStrategy cryptStrategy);这里是syncStrategy.synchronize(a,b,cryptStrategy);你能描述一下你为了达到这个结果所采取的思考过程吗?还是主要与经验有关?有什么例子吗?再次感谢@user1546985一旦您意识到需要拆分这两个策略,您的选择就会受到限制:要么在构造函数中将一个策略交给另一个,要么将它传递给需要它的方法。我更喜欢传递给方法,因为我想不出为什么加密策略的实例应该属于同步策略,或者为什么同步策略的实例应该属于加密策略。