避免模​​块之间的依赖关系

时间:2015-08-28 17:41:26

标签: java design-patterns adapter

为了问题,我们说我有一个加密模块opensslCryptographicModule,它有以下方法:

public String encrypt(String content, String key);
public String decrypt(String encrypted, String key);

另一个模块,让我们称之为MainModule需要加密模块才能工作。

由于MainModule中使用的加密模块可能会更改,因此我创建了一个接口,如下所示:

public interface CryptographicModule {
    public String encrypt(String content, String key);
    public String decrypt(String encrypted, String key);
}

MainModule在其构造函数中使用CryptographicModule

我的问题是如何让加密模块完全独立?

如果我将接口放在MainModule中,那么opensslCryptographicModule将需要实现在其他项目中声明的接口,因此将依赖于该项目。

但是如果我将接口放在opensslCryptographicModule中,那么其他加密模块将需要opensslCryptographicModule来获取接口。

我能看到的唯一解决方案是第三个模块,它将在两个模块之间建立链接。

它将使用适配器模式实现接口(将在MainModule中)以提供加密模块的功能:

public class OpenSSLCryptographicModuleAdapter implements CryptographicModule  {

    private OpensslCryptographicModule module;    

    public OpenSSLCryptographicModuleAdapter(OpensslCryptographicModule module) {
        this.module = module 
    }

    @Override
    public String encrypt(String content, String key) {
        //...
    }

    @Override
    public String decrypt(String encrypted, String key) {
        //...
    }
}

MainModule依赖于第三个模块。

但我觉得有点矫枉过正,特别是当我们控制了所有模块时。当使用第三方库或者我们想要使用一些旧代码时,这种设计模式很棒,但是在整个项目编写完成时却没有。

2 个答案:

答案 0 :(得分:2)

您的分析是正确的,包括您声明这可能是矫枉过正的部分。 这是人们经常错过的“设计模式”的基本部分。有时,应用模式(解耦等)的好处不会超过成本(通常是“复杂性”)。 工程的一部分是弄清楚权衡是否值得 三个模块可能是一个好主意,或者它可能对你的情况有点过分;这真的取决于你的项目的具体情况。从更简单的设置开始,然后在稍后将因子接口输出,当您发现适当的抽象的位置时,这可能是一个好主意。对于这样的事情,不可能给出一般规则。

答案 1 :(得分:0)

您可以制作OpenSSLCryptographicModule和抽象类,并对抽象方法进行加密和解密。然后,您将只有一个基本抽象类,以及每个实现的另一个具体类。