Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 设计模式:具体实现如何在运行时选择行为?_Oop_Design Patterns - Fatal编程技术网

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一旦您意识到需要拆分这两个策略,您的选择就会受到限制:要么在构造函数中将一个策略交给另一个,要么将它传递给需要它的方法。我更喜欢传递给方法,因为我想不出为什么加密策略的实例应该属于同步策略,或者为什么同步策略的实例应该属于加密策略。