为了问题,我们说我有一个加密模块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
依赖于第三个模块。
但我觉得有点矫枉过正,特别是当我们控制了所有模块时。当使用第三方库或者我们想要使用一些旧代码时,这种设计模式很棒,但是在整个项目编写完成时却没有。
答案 0 :(得分:2)
您的分析是正确的,包括您声明这可能是矫枉过正的部分。 这是人们经常错过的“设计模式”的基本部分。有时,应用模式(解耦等)的好处不会超过成本(通常是“复杂性”)。 工程的一部分是弄清楚权衡是否值得 三个模块可能是一个好主意,或者它可能对你的情况有点过分;这真的取决于你的项目的具体情况。从更简单的设置开始,然后在稍后将因子接口输出,当您发现适当的抽象的位置时,这可能是一个好主意。对于这样的事情,不可能给出一般规则。
答案 1 :(得分:0)
您可以制作OpenSSLCryptographicModule和抽象类,并对抽象方法进行加密和解密。然后,您将只有一个基本抽象类,以及每个实现的另一个具体类。