c语言编程笔录

首页 >   > 笔记大全

笔记大全

TypeScript的5种设计模式分别是什么

更新时间:2023-07-14
## 简介 TypeScript 是微软开发的一种编程语言。它是 JavaScript 的一个超集,支持 ECMAScript 标准,并加入了很多新的特性。TypeScript 最显著的特点是提供了静态类型检查,这能够在代码编写过程中避免一些错误的出现。 设计模式是软件开发中常用的一种架构模式,它应用了通用的解决方案。在这个文章里,我将会探讨 TypeScript 中的五种常见的设计模式。 ## 单例模式 单例模式是一种创建型模式,它保证某一类的一个唯一实例。在 TypeScript 中,我们可以使用类来实现这种模式。 ```typescript class Singleton { private static instance: Singleton; private constructor() {} public static getInstance(): Singleton { if (!Singleton.instance) { Singleton.instance = new Singleton(); } return Singleton.instance; } public someMethod() { console.log("Some Method"); } } const instance1 = Singleton.getInstance(); const instance2 = Singleton.getInstance(); console.log(instance1 === instance2); // true instance1.someMethod(); // Some Method ``` 在这个示例中,`getInstance` 方法被用来获取实例。在第一次调用时,会创建一个实例,之后的每次调用会返回相同的实例,这能够确保该类只有一个实例。 ## 工厂模式 工厂模式是一种创建型模式,它为我们提供了一个方法来获取实例化某些类型的对象。在 TypeScript 中,我们可以定义一个工厂类来创建对象。 ```typescript interface Person { name: string; age: number; } class Employee implements Person { constructor(public name: string, public age: number, public salary: number) {} } class Manager implements Person { constructor(public name: string, public age: number, public bonus: number) {} } class PersonFactory { public static createEmployee(name: string, age: number, salary: number): Employee { return new Employee(name, age, salary); } public static createManager(name: string, age: number, bonus: number): Manager { return new Manager(name, age, bonus); } } const employee = PersonFactory.createEmployee("Alice", 25, 5000); console.log(employee.name); // Alice const manager = PersonFactory.createManager("Bob", 35, 10000); console.log(manager.name); // Bob ``` 在这个示例中,我们定义了 `Person` 接口和两个实现它的类,`Employee` 和 `Manager`。我们还创建了一个工厂类,它让我们能够实例化这两种类型的对象。这个 `PersonFactory` 类的两个方法,`createEmployee` 和 `createManager`,分别返回一个新的 `Employee` 或 `Manager` 类型的对象。 ## 适配器模式 适配器模式是一种结构型模式,它允许类能够兼容不同接口。在 TypeScript 中,我们可以使用适配器来适应不同的 API。 ```typescript interface Apple { getWeight(): number; } class Macintosh implements Apple { public getWeight() { return 5; } } interface Orange { getWeightInGram(): number; } class Tangerine implements Orange { public getWeightInGram() { return 100; } } class OrangeAdapter implements Apple { constructor(private readonly orange: Orange) {} public getWeight() { const weightInGrams = this.orange.getWeightInGram(); return weightInGrams / 20; } } const macintosh = new Macintosh(); console.log(macintosh.getWeight()); // 5 const tangerine = new Tangerine(); const orangeAdapter = new OrangeAdapter(tangerine); console.log(orangeAdapter.getWeight()); // 5 ``` 在这个示例中,我们有一个 `Apple` 接口和两个实现它的类,`Macintosh` 和 `Tangerine`。`Macintosh` 实现了 `Apple` 接口中的 `getWeight` 方法,而 `Tangerine` 实现了一个和 `getWeight` 具有不同签名的 `getWeightInGram` 方法。我们还创建了一个适配器,`OrangeAdapter`,它实现了 `Apple` 接口,并且接收一个 `Orange` 对象。 ## 观察者模式 观察者模式是一种行为型模式,它定义了一个一对多的依赖关系。当被观察者对象发生改变时,通知其依赖者。在 TypeScript 中,我们可以使用一个基类和一些接口来实现观察者模式。 ```typescript interface Observer { update(): void; } class Subject { private observers: Observer[] = []; public attach(observer: Observer) { this.observers.push(observer); } public detach(observer: Observer) { this.observers = this.observers.filter((item) => item !== observer); } public notify() { this.observers.forEach((observer) => observer.update()); } } class ConcreteObserver implements Observer { constructor(private readonly subject: Subject) {} public update() { console.log(`${this.subject} is updated`); } } const subject = new Subject(); const observer1 = new ConcreteObserver(subject); const observer2 = new ConcreteObserver(subject); subject.notify(); // Subject is updated subject.detach(observer2); subject.notify(); // Subject is updated ``` 在这个示例中,我们定义了一个 `Observer` 接口和一个 `Subject` 类。`Subject` 类有一个数组,保存观察者对象。它的 `attach` 方法用来添加观察者, `detach` 方法用来删除观察者, `notify` 方法会通知所有观察者更新。我们还定义了一个实现了 `Observer` 接口的 `ConcreteObserver` 类,它在观察者更新时输出一条消息。 ## 策略模式 策略模式是一种行为型模式,它定义了一系列算法,将它们各自封装,并且使它们可以相互替换。在 TypeScript 中,我们可以使用接口和类来实现该模式。 ```typescript interface SortingStrategy { sort(arr: number[]): void; } class QuickSort implements SortingStrategy { public sort(arr: number[]) { console.log("QuickSort: ", arr.sort()); } } class BubbleSort implements SortingStrategy { public sort(arr: number[]) { console.log("BubbleSort: ", arr.sort()); } } class Sorter { constructor(private readonly strategy: SortingStrategy) {} public sort(arr: number[]) { this.strategy.sort(arr); } } const arr = [3, 1, 2, 6, 4, 5]; const sorter1 = new Sorter(new QuickSort()); sorter1.sort(arr); // QuickSort: [1, 2, 3, 4, 5, 6] const sorter2 = new Sorter(new BubbleSort()); sorter2.sort(arr); // BubbleSort: [1, 2, 3, 4, 5, 6] ``` 在这个示例中,我们定义了一个 `SortingStrategy` 接口和两个实现了它的类,`QuickSort` 和 `BubbleSort`。我们还定义了一个 `Sorter` 类,它接收一个 `SortingStrategy` 对象并在 `sort` 方法中执行排序操作。