TypeScript 设计模式:示例与实现

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

TypeScript中的设计模式:从理论到实践



设计模式(Design Patterns)是软件开发中针对典型问题的经过验证的解决方案。在TypeScript的背景下,凭借其强大的类型系统和面向对象编程支持,许多来自"四人帮"(GoF)书籍的经典模式获得了更优雅的新体现。在本文中,我们将通过TypeScript的实际示例分析三种关键模式,帮助您编写更清晰、可扩展且易于维护的代码。



1. 创建型模式:Singleton(单例模式)



目的:确保一个类只有一个实例,并提供全局访问点。



在TypeScript中,由于静态属性和私有构造函数的存在,实现Singleton特别方便。此模式非常适合管理数据库连接、日志记录器或缓存。



class DatabaseConnection {    private static instance: DatabaseConnection;    private connectionString: string;

private constructor(connectionString: string) { this.connectionString = connectionString; console.log(`已创建连接到:${connectionString}`); }

public static getInstance(connectionString?: string): DatabaseConnection { if (!DatabaseConnection.instance) { if (!connectionString) { throw new Error("首次初始化需要连接字符串"); } DatabaseConnection.instance = new DatabaseConnection(connectionString); } return DatabaseConnection.instance; }

public query(sql: string): void { console.log(`执行查询:${sql} 在 ${this.connectionString} 上`); }}

// 使用const db1 = DatabaseConnection.getInstance("postgres://localhost:5432/mydb");const db2 = DatabaseConnection.getInstance();

console.log(db1 === db2); // true — 同一个对象db1.query("SELECT * FROM users");


重要提示:在TypeScript中,可以使用readonly和泛型来实现更灵活的实现。但请记住,Singleton可能会使测试变得复杂——考虑将依赖注入(DI)作为替代方案。



2. 结构型模式:Decorator(装饰器模式)



目的:动态地向对象添加新职责,而不改变其结构。在TypeScript中,装饰器是一流的语言特性(在ES5中是实验性的,但在Angular和NestJS中广泛使用)。



让我们看一个用于记录方法调用的装饰器示例:



// 目标接口interface ILogger {    log(message: string): void;}

// 基础类class SimpleLogger implements ILogger { public log(message: string): void { console.log(`[LOG]: ${message}`); }}

// 装饰器(包装类)class TimestampDecorator implements ILogger { private logger: ILogger;

constructor(logger: ILogger) { this.logger = logger; }

public log(message: string): void { const timestamp = new Date().toISOString(); this.logger.log(`[${timestamp}] ${message}`); }}

// 格式化装饰器class UpperCaseDecorator implements ILogger { private logger: ILogger;

constructor(logger: ILogger) { this.logger = logger; }

public log(message: string): void { this.logger.log(message.toUpperCase()); }}

// 使用let logger: ILogger = new SimpleLogger();logger.log("你好世界"); // [LOG]: 你好世界

logger = new TimestampDecorator(logger);logger = new UpperCaseDecorator(logger);logger.log("装饰器正在工作"); // [LOG]: [2025-01-15T10:30:00.000Z] 装饰器正在工作


建议:在TypeScript中,还可以使用类和属性装饰器(@decorator语法)。

博客

书籍推荐