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 天前
Serilog 日志库简单实践(二):控制台与调试 Sinks(.net8)
后端
扯蛋4381 天前
LangChain的学习之路( 一 )
前端·langchain·mcp
Mr.Jessy1 天前
Web APIs学习第一天:获取 DOM 对象
开发语言·前端·javascript·学习·html
想不明白的过度思考者1 天前
Rust——异步递归深度指南:从问题到解决方案
开发语言·后端·rust
ConardLi1 天前
Easy Dataset 已经突破 11.5K Star,这次又带来多项功能更新!
前端·javascript·后端
芒克芒克1 天前
ssm框架之Spring(上)
java·后端·spring
冴羽1 天前
10 个被严重低估的 JS 特性,直接少写 500 行代码
前端·javascript·性能优化
rising start1 天前
四、CSS选择器(续)和三大特性
前端·css
冒泡的肥皂1 天前
MVCC初学demo(二
数据库·后端·mysql
追逐时光者1 天前
一款基于 .NET WinForm 开源、轻量且功能强大的节点编辑器,采用纯 GDI+ 绘制无任何依赖库仅仅100+Kb
后端·.net