做服装有哪些好的网站,做seo的网站,手机旅游网站建设,龙岗建设高端网站策略模式#xff08;Strategy Pattern#xff09;是一种行为设计模式#xff0c;它允许你定义一系列算法#xff0c;并将每个算法封装起来#xff0c;使它们可以相互替换。下面介绍策略模式在 TypeScript 中的实现。策略模式基本概念策略模式包含三个主要部分#xff1a;…策略模式Strategy Pattern是一种行为设计模式它允许你定义一系列算法并将每个算法封装起来使它们可以相互替换。下面介绍策略模式在 TypeScript 中的实现。策略模式基本概念策略模式包含三个主要部分Context上下文维护一个策略对象的引用Strategy策略接口定义所有支持的算法的公共接口ConcreteStrategy具体策略实现策略接口的具体算法image基础实现1. 定义策略接口// 策略接口interface PaymentStrategy {pay(amount: number): void;}2. 实现具体策略类// 信用卡支付策略class CreditCardPayment implements PaymentStrategy {private cardNumber: string;private name: string;constructor(cardNumber: string, name: string) {this.cardNumber cardNumber;this.name name;}pay(amount: number): void {console.log(使用信用卡支付 $${amount});console.log(卡号: ${this.cardNumber}, 持卡人: ${this.name});}}// PayPal支付策略class PayPalPayment implements PaymentStrategy {private email: string;constructor(email: string) {this.email email;}pay(amount: number): void {console.log(使用PayPal支付 $${amount});console.log(邮箱: ${this.email});}}// 加密货币支付策略class CryptoPayment implements PaymentStrategy {private walletAddress: string;constructor(walletAddress: string) {this.walletAddress walletAddress;}pay(amount: number): void {console.log(使用加密货币支付 $${amount});console.log(钱包地址: ${this.walletAddress});}}3. 创建上下文类// 支付上下文class PaymentContext {private strategy: PaymentStrategy;constructor(strategy: PaymentStrategy) {this.strategy strategy;}// 设置支付策略setStrategy(strategy: PaymentStrategy): void {this.strategy strategy;}// 执行支付executePayment(amount: number): void {this.strategy.pay(amount);}}4. 使用示例// 使用示例const paymentContext new PaymentContext(new CreditCardPayment(1234-5678-9012, 张三));// 使用信用卡支付paymentContext.executePayment(100);// 切换到PayPal支付paymentContext.setStrategy(new PayPalPayment(zhangexample.com));paymentContext.executePayment(200);// 切换到加密货币支付paymentContext.setStrategy(new CryptoPayment(1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa));paymentContext.executePayment(300);更复杂的示例排序策略// 排序策略接口interface SortStrategyT {sort(items: T[]): T[];}// 冒泡排序策略class BubbleSortT implements SortStrategyT {sort(items: T[]): T[] {console.log(使用冒泡排序);const arr [...items];for (let i 0; i arr.length; i) {for (let j 0; j arr.length - i - 1; j) {if (arr[j] arr[j 1]) {[arr[j], arr[j 1]] [arr[j 1], arr[j]];}}}return arr;}}// 快速排序策略class QuickSortT implements SortStrategyT {sort(items: T[]): T[] {console.log(使用快速排序);if (items.length 1) return items;const pivot items[0];const left [];const right [];for (let i 1; i items.length; i) {if (items[i] pivot) {left.push(items[i]);} else {right.push(items[i]);}}return [...this.sort(left), pivot, ...this.sort(right)];}}// 排序上下文class SorterT {private strategy: SortStrategyT;constructor(strategy: SortStrategyT) {this.strategy strategy;}setStrategy(strategy: SortStrategyT): void {this.strategy strategy;}sort(items: T[]): T[] {return this.strategy.sort(items);}}// 使用示例const numbers [64, 34, 25, 12, 22, 11, 90];const sorter new Sorternumber(new BubbleSortnumber());console.log(排序前:, numbers);console.log(排序后:, sorter.sort(numbers));// 切换排序策略sorter.setStrategy(new QuickSortnumber());console.log(使用快速排序:, sorter.sort(numbers));使用函数式编程的实现TypeScript 也支持函数式风格的策略模式// 策略类型定义type DiscountStrategy (amount: number) number;// 具体策略函数const noDiscount: DiscountStrategy (amount: number) amount;const percentageDiscount (percentage: number): DiscountStrategy (amount: number) amount * (1 - percentage / 100);const fixedDiscount (discount: number): DiscountStrategy (amount: number) Math.max(0, amount - discount);// 上下文class ShoppingCart {private items: number[] [];private discountStrategy: DiscountStrategy noDiscount;addItem(price: number): void {this.items.push(price);}setDiscountStrategy(strategy: DiscountStrategy): void {this.discountStrategy strategy;}getTotal(): number {const subtotal this.items.reduce((sum, price) sum price, 0);return this.discountStrategy(subtotal);}}// 使用示例const cart new ShoppingCart();cart.addItem(100);cart.addItem(50);cart.addItem(30);console.log(原价:, cart.getTotal()); // 180cart.setDiscountStrategy(percentageDiscount(10)); // 9折console.log(9折后:, cart.getTotal()); // 162cart.setDiscountStrategy(fixedDiscount(50)); // 减50console.log(减50后:, cart.getTotal()); // 130策略模式的优点开闭原则可以引入新策略而不修改现有代码消除条件语句避免大量的 if-else 或 switch-case 语句算法复用可以在不同的上下文中复用策略测试友好每个策略都可以独立测试