ради вопроса, скажем, у меня есть криптографический модуль 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 реализации – darkheir
По модулю, вы имеете в виду файл .java? – aglassman