我可以在外观设计模式中有一个界面吗?

Can I have an interface in facade design pattern?

我想知道如果我有一个门面 class,我可以创建一个接口并拥有 class 的多个实现。

例如:

interface IUserDetailFacade{}

public class UserDetailsFacade implements IUserDetailFacade{}

public class UserDetailsLdapFacade implements IUserDetailFacade{}

您的方向是正确的,因为您系统的其他部分将与抽象(即您的外观接口)耦合,同时您可以保证您的系统将使用整个外观接口的多个给定实现。

当然可以。

您分享的示例不够详细,我无法理解如何再添加一层抽象(您想要创建的 interface)。

但让我给你举个例子,说明这是有道理的。

Example

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

您可以将 CppCompiler 创建为不同外观的 interface,每种外观对应一种 CppCompiler

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

TurboCppCompilerBorlandCppCompilerGccCppCompiler 等是 类 子系统的 facades,执行不同的步骤在编译中,如解析、汇编、链接等。例如,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 */
    }
}

Usage

您可以创建一个获取编译器的工厂方法(注意 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);
}

希望这对您有所帮助。