Facade 外观

发布于:2024-04-18 ⋅ 阅读:(26) ⋅ 点赞:(0)

意图

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一字系统更加容易使用。

结构

其中:

Facade知道哪些子系统负责处理请求;将客户的请求代理给适当的子系统对象。

Subsystem classes实现子系统的功能;处理由Facade对象指派的任务;没有Facade的任何相关信息,即没有指向Facade的指针。

适用性

Facade模式使用于:

  • 要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用时,都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的默认视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制的用户可以越过Facade层。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他子系统分离,可以提高子系统的独立性和可移植性。
  • 当需要构建一个层次结构的子系统时,使用 Facade模式定义子系统中每层的入口点。如果系统之间是相互依赖的,则可以让它们仅通过Facade进行通信,从而简化了它们之间的依赖关系。

代码示例

假设需要创建一个应用程序来管理一个复杂的系统,该系统包含多个子系统,每个子系统都提供不同的功能。 为了简化与这些子系统的交互,可以使用外观模式创建一个统一的接口。

// 定义一个外观类,它将提供对所有子系统的统一访问
public class Facade {
    private SubSystem1 subSystem1;
    private SubSystem2 subSystem2;
    private SubSystem3 subSystem3;

    // 构造函数,初始化所有子系统
    public Facade(SubSystem1 subSystem1, SubSystem2 subSystem2, SubSystem3 subSystem3) {
        this.subSystem1 = subSystem1;
        this.subSystem2 = subSystem2;
        this.subSystem3 = subSystem3;
    }

    // 提供一个方法来执行所有子系统的操作
    public void performOperation() {
        subSystem1.operation1();
        subSystem2.operation2();
        subSystem3.operation3();
    }
}

// 定义一个子系统接口
interface SubSystem {
    void operation();
}

// 定义三个子系统类
class SubSystem1 implements SubSystem {
    @Override
    public void operation() {
        System.out.println("SubSystem1 operation");
    }
}

class SubSystem2 implements SubSystem {
    @Override
    public void operation() {
        System.out.println("SubSystem2 operation");
    }
}

class SubSystem3 implements SubSystem {
    @Override
    public void operation() {
        System.out.println("SubSystem3 operation");
    }
}

// 使用外观类
public class Main {
    public static void main(String[] args) {
        SubSystem1 subSystem1 = new SubSystem1();
        SubSystem2 subSystem2 = new SubSystem2();
        SubSystem3 subSystem3 = new SubSystem3();

        Facade facade = new Facade(subSystem1, subSystem2, subSystem3);
        facade.performOperation();
    }
}

代码设计注释:

  • Facade 类是外观类,它提供对所有子系统的统一访问。
  • SubSystem 接口定义了所有子系统都必须实现的操作。
  • SubSystem1SubSystem2SubSystem3 类是三个具体的子系统类,它们实现了 SubSystem 接口。
  • performOperation() 方法执行所有子系统的操作。
  • 在 Main 类中,我们创建了三个子系统对象,并使用它们创建了一个 Facade 对象。 然后,我们调用 Facade 对象的 performOperation() 方法来执行所有子系统的操作。

优点:

  • 外观模式简化了与复杂系统的交互。
  • 它将客户端代码与子系统代码解耦。
  • 它提高了代码的可维护性和可测试性。

缺点:

  • 外观模式可能会增加系统的复杂性。
  • 它可能会隐藏子系统之间的依赖关系。

总结:

外观模式是一种有用的设计模式,可以用来简化与复杂系统的交互。 它特别适用于需要对多个子系统提供统一访问的场景。