2016-12-11 3 views
0

Я хочу знать, есть ли у меня класс фасадов, могу ли я создать интерфейс и иметь несколько реализаций класса.Могу ли я иметь интерфейс в шаблоне проектирования фасадов?

Например:

interface IUserDetailFacade{} 

public class UserDetailsFacade implements IUserDetailFacade{} 

public class UserDetailsLdapFacade implements IUserDetailFacade{} 
+0

Не так много для работы здесь, можете ли вы привести пример своих намерений. Целью шаблона «Фасад» является абстрактная сложность множества связанных систем иерархии классов. Таким образом, я могу пропустить интерпретацию вашего вопроса; однако, в то время как фасад, конечно, является абстракцией сам по себе, он по иронии судьбы подходит к конкретным подсистемам, которые вы пытаетесь пререкаться. В этом отношении ваш вопрос не имеет смысла, потому что это похоже на вопрос: «Если у меня есть решение проблемы, я могу найти другое решение по той же проблеме, используя одно и то же решение». Круговая логика твоя, я просто указываю. –

ответ

1

Конечно, вы можете.

Пример, который вы поделились не достаточно подробно для меня, чтобы понять, как еще один уровень абстракции (interface вы хотите создать) вписывается в.

Но позвольте мне дать вам пример, когда это будет иметь смысл.

Пример

Предположим, вы создаете приложение, которое проверяет, насколько эффективно различные C++ компиляторы компилировать тот же исходный код.

Вы можете создать CppCompiler как interface на разные фасады, по одному для каждого типа CppCompiler.

public interface CppCompiler { 
    void compile(String sourceFile); 
} 

TurboCppCompiler, BorlandCppCompiler, GccCppCompiler и т.д., фасады подсистемы классов, которые делают различные этапы компиляции, как синтаксический анализ, сборка, связывая и т.д. Например, TurboCppCompiler реализация будет выглядеть примерно так ,

public class TurboCppCompiler implements CppCompiler { 

    // .. private variables 

    public TurboCppCompiler(TurboParser parser, TurboAssembler assembler, TurboLinker linker) { 
     this.parser = parser; 
     this.assembler = assembler; 
     this.linker = linker; 
    } 

    public void compile(String sourceFile) { 
     /* Compile the code Borland Cpp style using the subsystems Parser, Assembler, Linker */ 
    } 
} 

Использования

Вы можете создать фабричный метод, который получает компилятор (обратите внимание, как CppCompiler используются в качестве return типа здесь)

public static CppCompiler createCppCompiler(CompilerType type) { 
    switch (type) { 
     case TURBO: 
      return new TurboCppCompiler(new TurboParser(), new TurboAssembler(), new TurboLinker()); 
     case BORLAND: 
      return new BorlandCppCompiler(new BorlandParser(), new BorlandAssembler(), new BorlandLinker()); 
     case GCC: 
      return new GccCppCompiler(new GccParser(), new GccAssembler(), new GccLinker()); 
    } 
    throw new AssertionError("unknown compiler type:" + type); 
} 

Надеется, что это помогает.

1

Вы находитесь в правильном пути, потому что другие части вашей системы будут связаны с абстракциями (т.е. ваш фасад интерфейс) в то время как вы можете гарантировать, что ваша система будет работать с несколькими учитывая реализации всего интерфейса фасада.

Смежные вопросы