TypeScript设计模式:门面模式

门面模式(Facade Pattern)是一种结构型设计模式,通过提供统一接口简化对复杂子系统的访问,隐藏子系统内部细节,使客户端代码更易用。

设计模式原理

门面模式通过为复杂子系统提供单一入口点,屏蔽内部实现细节。客户端只需与门面交互,无需直接操作子系统。

结构概述

  • Facade(门面) :定义高层次接口,协调子系统操作。
  • Subsystem Classes(子系统类) :实现具体业务逻辑。
  • Client(客户端) :通过门面调用子系统功能。

优点

  • 简化接口:降低客户端与子系统的耦合,减少学习成本。
  • 松耦合:子系统变化不影响客户端代码。
  • 可维护性:隔离子系统逻辑,便于测试和修改。
  • 分层架构:适合Nest.js模块化设计,封装复杂交互。

适用场景

  • 简化多服务交互(如用户注册涉及用户管理、邮件发送)。
  • 隐藏框架或库的复杂实现。
  • 构建统一API入口,提升代码一致性。

Nest.js框架源代码分析:门面模式的应用

在Nest.js中,NestFactoryNestApplication共同体现了门面模式。NestFactory作为静态工厂类,负责创建NestApplication实例,而NestApplication作为核心门面,封装了应用初始化、HTTP服务器管理和依赖注入等复杂逻辑,为开发者提供简化的接口。

NestFactory 和 NestApplication 的关系

  • NestFactory :位于packages/core/src/nest-factory.ts,是一个静态工厂类,负责创建和配置NestApplication实例。它通过create方法初始化应用,设置HTTP适配器(如Express或Fastify)并返回NestApplication对象。NestFactory本身不处理运行时逻辑,而是充当配置和初始化的入口。
  • NestApplication :位于packages/core/src/application/nest-application.ts,是运行时的核心门面,管理模块解析、HTTP服务器启动和依赖注入等功能。开发者通过NestApplicationinit()listen()方法操作应用,而无需了解底层细节。

NestFactoryNestApplication的协作类似于门面模式的客户端和门面关系:NestFactory为开发者提供创建应用的简单接口,而NestApplication隐藏了复杂的子系统交互(如模块加载、依赖注入)。

代码示例

NestFactory 源码(简化摘录)

typescript 复制代码
// packages/core/src/nest-factory.ts
import { NestApplication } from './application/nest-application';
import { HttpAdapterHost } from './adapters/http-adapter-host';
import { Module } from './injector/module';
import { NestApplicationOptions } from './interfaces';

export class NestFactory {
  public static async create(
    module: any,
    options?: NestApplicationOptions,
  ): Promise<NestApplication> {
    const httpAdapter = new HttpAdapterHost(options?.httpAdapter);
    const app = new NestApplication(new Module(module), httpAdapter, options);
    await app.init();
    return app;
  }
}

NestApplication 源码(简化摘录)

typescript 复制代码
// packages/core/src/application/nest-application.ts
import { INestApplication, NestApplicationOptions } from './interfaces';
import { Module } from '../injector/module';
import { HttpAdapterHost } from '../adapters/http-adapter-host';
import { Injector } from '../injector';

export class NestApplication implements INestApplication {
  constructor(
    private readonly module: Module,
    private readonly httpAdapterRef?: HttpAdapterHost,
    private readonly options?: NestApplicationOptions,
  ) {
    this.injector = new Injector();
    this.initialize();
  }

  public async init(): Promise<this> {
    // 初始化模块、绑定适配器等
    await this.callInitHooks();
    await this.callBootstrapDoneHook();
    return this;
  }

  public listen(port?: number, hostname?: string, callback?: () => void): Promise<this> {
    // 简化HTTP服务器启动
    return this.httpAdapterRef.httpAdapter.listen(port, hostname, callback);
  }

  public get<T = any>(name: string | symbol | Type<T>, options?: GetOrResolveOptions<T>): T {
    // 统一依赖访问
    return this.injector.get(name, options);
  }
}

运行结果

main.ts中,开发者通过NestFactory创建并启动应用:

typescript 复制代码
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule); // 使用NestFactory创建NestApplication
  await app.listen(3000); // 调用NestApplication的listen方法启动服务器
}
bootstrap();

总结

门面模式通过NestFactoryNestApplication在Nest.js中得到完美体现。NestFactory作为创建应用的门面,简化了初始化流程;NestApplication作为运行时门面,封装了模块管理、HTTP服务器和依赖注入等功能。开发者只需调用简单接口即可操作复杂系统,门面模式确保了代码的简洁性、可维护性和模块化,适合构建大型Nest.js应用。

相关推荐
考虑考虑1 天前
fastjson调用is方法开头注意
java·后端·java ee
小蒜学长1 天前
springboot基于javaweb的小零食销售系统的设计与实现(代码+数据库+LW)
java·开发语言·数据库·spring boot·后端
brzhang1 天前
为什么 OpenAI 不让 LLM 生成 UI?深度解析 OpenAI Apps SDK 背后的新一代交互范式
前端·后端·架构
EnCi Zheng1 天前
JPA 连接 PostgreSQL 数据库完全指南
java·数据库·spring boot·后端·postgresql
brzhang1 天前
OpenAI Apps SDK ,一个好的 App,不是让用户知道它该怎么用,而是让用户自然地知道自己在做什么。
前端·后端·架构
LucianaiB1 天前
从玩具到工业:基于 CodeBuddy code CLI 构建电力变压器绕组短路智能诊断系统
后端
井柏然1 天前
前端工程化—实战npm包深入理解 external 及实例唯一性
前端·javascript·前端工程化
武子康1 天前
大数据-118 - Flink 批处理 DataSet API 全面解析:应用场景、代码示例与优化机制
大数据·后端·flink
不要再敲了1 天前
Spring Security 完整使用指南
java·后端·spring
IT_陈寒1 天前
Redis 高性能缓存设计:7个核心优化策略让你的QPS提升300%
前端·人工智能·后端