意图
为子系统中的一组接口提供一个一致的界面,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
接口定义了所有子系统都必须实现的操作。SubSystem1
,SubSystem2
,SubSystem3
类是三个具体的子系统类,它们实现了SubSystem
接口。performOperation()
方法执行所有子系统的操作。- 在
Main
类中,我们创建了三个子系统对象,并使用它们创建了一个Facade
对象。 然后,我们调用Facade
对象的performOperation()
方法来执行所有子系统的操作。
优点:
- 外观模式简化了与复杂系统的交互。
- 它将客户端代码与子系统代码解耦。
- 它提高了代码的可维护性和可测试性。
缺点:
- 外观模式可能会增加系统的复杂性。
- 它可能会隐藏子系统之间的依赖关系。
总结:
外观模式是一种有用的设计模式,可以用来简化与复杂系统的交互。 它特别适用于需要对多个子系统提供统一访问的场景。