我可以在外观设计模式中使用界面吗?

时间:2016-12-11 17:57:58

标签: java design-patterns interface facade

我想知道如果我有一个Facade类,我可以创建一个接口并拥有该类的多个实现。

E.g:

interface IUserDetailFacade{}

public class UserDetailsFacade implements IUserDetailFacade{}

public class UserDetailsLdapFacade implements IUserDetailFacade{}

2 个答案:

答案 0 :(得分:1)

您处于正确的轨道,因为您的系统的其他部分将与抽象(即您的外观界面)相结合,同时您可以保证您的系统将使用整个外观界面的多个给定实现。

答案 1 :(得分:1)

当然可以。

您分享的示例并不是非常详细,我可以理解如何再插入一个抽象层(您想要创建的interface)。

但是,让我举个例子来说明这一点。

  

实施例

假设您正在创建一个应用程序,用于测试不同C ++编译器编译相同源代码的效率。

您可以将CppCompiler创建为interface到不同的立面,每种类型CppCompiler各一个。

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

TurboCppCompilerBorlandCppCompilerGccCppCompiler等是类的子系统的 facade ,它们在编译中执行不同的步骤,如解析,组装,链接等等。例如,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);
}

希望这有帮助。