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语法)。