结构型模式-外观模式

外观模式(Facade Pattern)是一种结构型设计模式,用于为复杂子系统提供一个统一的、高层次的接口。通过外观模式,客户端无需深入了解子系统的内部复杂性,只需与外观类交互即可完成任务,从而简化了使用方式,降低了耦合性。

核心思想

简化接口:通过一个"外观类"(Facade),封装子系统的复杂接口,提供简洁易用的接口。

解耦合:外观类将客户端与子系统分离,使得客户端无需直接操作子系统,从而降低了耦合度。

对子系统透明:外观模式并不限制子系统的直接使用,客户端仍可根据需要访问子系统的原始功能。

结构

  • Facade(外观类):对外提供简单的接口,隐藏子系统的复杂性。
  • Subsystem Classes(子系统类):实现子系统的核心功能,外观类通过调用它们的方法来实现功能。
  • Client(客户端):使用外观类提供的接口与子系统交互。

Java实现示例

java 复制代码
//子系统类
public class SubsystemA {
    public void operationA() {
        System.out.println("子系统A的操作");
    }
}

public class SubsystemB {
    public void operationB() {
        System.out.println("子系统B的操作");
    }
}

public class SubsystemC {
    public void operationC() {
        System.out.println("子系统C的操作");
    }
}
//外观类
public class Facade {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;
    private SubsystemC subsystemC;

    public Facade() {
        subsystemA = new SubsystemA();
        subsystemB = new SubsystemB();
        subsystemC = new SubsystemC();
    }

    public void method1() {
        System.out.println("方法1:整合子系统A和B的功能");
        subsystemA.operationA();
        subsystemB.operationB();
    }

    public void method2() {
        System.out.println("方法2:整合子系统B和C的功能");
        subsystemB.operationB();
        subsystemC.operationC();
    }
}
//客户端代码
public class Main {
    public static void main(String[] args) {
        Facade facade = new Facade();

        // 调用外观类的方法
        facade.method1();
        facade.method2();
    }
}

适用场景

  • 简化客户端操作:客户端需要与多个子系统交互,而这些子系统接口复杂。
  • 需要分层解耦:外观类可以作为中间层,解耦客户端和底层子系统。
  • 子系统的重构或扩展:当子系统发生变化时,只需要调整外观类,而无需修改客户端代码。

优缺点

  • 优点:
    • 简化接口:为复杂子系统提供了一个简单接口。
    • 降低耦合:客户端与子系统通过外观类进行交互,减少直接依赖。
    • 更好地分层:通过外观类组织子系统,增强系统的可维护性。
  • 缺点:
    • 可能引入过多的外观类:如果不是设计得当,外观类可能过于复杂,反而违背简化的初衷。
    • 不符合开放/封闭原则:外观类一旦定义,要扩展功能需要修改原有代码。
    • 外观模式常用于构建大型系统,比如数据库访问、文件操作、网络请求等,通过外观模式屏蔽底层的复杂性,提升开发效率和可维护性。
相关推荐
Code_Solitude13 分钟前
C语言:关于二维数组的作业总结
java·c语言·前端
Wang's Blog15 分钟前
Java 项目实战: 外卖平台优化-Nginx六种负载均衡策略对比与选型
java·nginx·负载均衡
时间的拾荒人18 分钟前
Qt 文件操作详解:从基础类到读写实战
开发语言·qt·面试
Wang's Blog27 分钟前
Java 项目实战: 外卖平台优化-YApi接口管理平台与文档导入导出
java·开发语言·yapi
专业程序开发源32 分钟前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
jimy134 分钟前
基类没有虚析构函数,基类指针删除派生类对象,行为是未定义的
开发语言·c++
迅猛龙办公室43 分钟前
python获取星期字符串
开发语言·python
vx_Biye_Design1 小时前
springboot一站式旅游管理平台81037-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·课程设计·express·旅游
写后端的胖头鱼1 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
嵌入式学习菌1 小时前
ESP32 ModbusTCP 分片缓存
java·后端·spring