外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,并将其封装在一个简单易用的接口中,使得客户端可以更方便地使用子系统。
- // 子系统A
- class SubSystemA {
- public void operationA() {
- System.out.println("SubSystemA operation");
- }
- }
-
- // 子系统B
- class SubSystemB {
- public void operationB() {
- System.out.println("SubSystemB operation");
- }
- }
-
- // 外观类
- class Facade {
- private SubSystemA subSystemA;
- private SubSystemB subSystemB;
-
- public Facade() {
- this.subSystemA = new SubSystemA();
- this.subSystemB = new SubSystemB();
- }
-
- public void operation() {
- subSystemA.operationA();
- subSystemB.operationB();
- }
- }
-
-
- public class Main {
- public static void main(String[] args) {
- Facade facade = new Facade(); // 创建外观类对象
-
- facade.operation(); // 调用外观类的方法,实现对子系统的操作
- }
- }
在上述示例中,SubSystemA和SubSystemB分别代表两个子系统。Facade是单一外观类,封装了对这两个子系统的引用,并提供了一个名为operation()的方法来调用这两个子系统的具体操作。客户端通过创建一个外观数对象,并调用其方法来使用子系统。在此示例中,客户端只需要与外观类进行交互,而无需直接与子系统进行交互。
存在问题:
- // 子系统A
- class SubSystemA {
- public void operationA() {
- System.out.println("SubSystemA operation");
- }
- }
-
- // 子系统B
- class SubSystemB {
- public void operationB() {
- System.out.println("SubSystemB operation");
- }
- }
-
- // 外观类
- class Facade1 {
- private SubSystemA subSystemA;
-
- public Facade1() {
- this.subSystemA = new SubSystemA();
- }
-
- public void operation() {
- subSystemA.operationA();
- }
- }
-
- // 另一个外观类
- class Facade2 {
- private SubSystemB subSystemB;
-
- public Facade2() {
- this.subSystemB = new SubSystemB();
- }
-
- public void operation() {
- subSystemB.operationB();
- }
- }
-
-
- public class Main {
- public static void main(String[] args) {
- Facade1 facade1 = new Facade1(); // 创建外观数对象1
- Facade2 facade2 = new Facade2(); // 创建外观数对象2
-
- facade1.operation(); // 调用外观数对象1的方法,实现对子系统A的操作
- facade2.operation(); // 调用外观数对象2的方法,实现对子系统B的操作
- }
- }
在上述示例中,SubSystemA和SubSystemB分别代表两个不同的子系统。Facade1和Facade2是两个独立的外观类,分别封装了对这两个子系统的引用,并提供了一个名为 operation() 的方法来调用相应子系统的具体操作。客户端根据需要选择合适的外观类进行调用。在此示例中,客户端可以选择使用 Facade1 或 Facade2 来访问特定子系统。这样客户端只需要与所选外观类进行交互,而无需直接与各个子系统进行交互。
- // 子系统A
- class SubSystemA {
- public void operationA() {
- System.out.println("SubSystemA operation");
- }
- }
-
- // 子系统B
- class SubSystemB {
- public void operationB() {
- System.out.println("SubSystemB operation");
- }
- }
-
- // 外观类
- class Facade1 {
- private SubSystemA subSystemA;
- private Facade2 facade2;
-
- public Facade1() {
- this.subSystemA = new SubSystemA();
- this.facade2 = new Facade2();
- }
-
- public void operation() {
- subSystemA.operationA();
- facade2.operation(); // 嵌套调用Facade2的操作方法
- }
- }
-
- // 另一个外观类
- class Facade2 {
- private SubSystemB subSystemB;
-
- public Facade2() {
- this.subSystemB = new SubSystemB();
- }
-
- public void operation() {
- subSystemB.operationB();
- }
- }
-
-
- public class Main {
- public static void main(String[] args) {
- Facade1 facade1 = new Facade1(); // 创建外观类对象
-
- facade1.operation(); // 调用外观类对象的方法,实现对子系统A和子系统B的嵌套调用
- }
- }
在上述示例中,SubSystemA和SubSystemB分别代表两个不同的子系统。Facade1是一个外观类,封装了对这两个子系统的引用,并提供了一个名为 operation() 的方法来调用相应子系统的具体操作。在 operation() 方法内部,除了调用 subsystemA.operationA() 外,还创建并使用了 Facade2 对象,并通过其 operation() 方法实现对另一个子系统 B 的操作。
客户端只需要与最上层的外观数进行交互,即调用 facade1.operation() 方法。这样客户端无需关心底层具体子系统及其嵌套调用逻辑,通过外观类的嵌套调用,实现了对多个子系统的操作。
存在问题: