设计模式:具体实现如何在运行时选择行为?

时间:2012-07-23 21:38:16

标签: oop design-patterns

我对术语不熟悉,如果我的问题的任何部分都错了,请纠正我。

以下是我想到的例子: 一个文件同步程序,允许您将2个文件夹组合在一起,并指定选项,如镜像两个文件夹,仅单向复制内容等。
我如何在运行时指定每个具体实现如何复制文件(例如,不同类型的加密)。

以下是我有点想要完成的事情: http://i.imgur.com/fkVN9.png

我是否必须为每个实施具体实施?即MirrorAes,MirrorBlowfish,OnewayAes等?还有更好的选择吗?

由于

3 个答案:

答案 0 :(得分:0)

您有正交问题 - 同步类型和加密。解决这个问题的一种方法是策略模式,其中您的同步类的具体实现聚合加密类,同步器与加密接口交互,允许“混合和匹配”加密和同步,而不会对数量产生乘数效应。你写的课程。

答案 1 :(得分:0)

您的意思是,您需要加密策略吗?

使用抽象工厂和一组加密策略。如果您有多个选项,请使用构建器。

假设您有SHA1加密和DES加密。两者都实现了一个接口,比如GeneralEncryptionStrategy,你有一个EncryptionFactory,它接受一个字符串(“sha1”或“des”)作为参数,并创建一个相应类的实例。

答案 2 :(得分:0)

图表显示的方式,加密方式似乎取决于您进行同步的方式。我怀疑是这种情况(虽然我可能错了)。

如果您同步的方式与加密方式完全无关,请从继承切换到合成。将FolderPair设为SyncStrategyEncryptionStrategy的对象,如下所示:

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);
}

现在,您可以使用FolderPairSyncStrategy的实例配置EncryptionStrategy个对象,混合并匹配它们,而不会产生组合爆炸:

FolderPair p1 = new FolderPair(aUri, bUri, new OneWyaSync(), new AesCrypt());

此设计包含Strategy Pattern的两个应用程序 - 一个用于同步行为,另一个用于加密。