typescript: Strategy Pattern
/** * Strategy Pattern 策略是一种行为设计模式, 它将一组行为转换为对象, 并使其在原始上下文对象内部能够相互替换。 * * file: Strategyts.ts * The Context defines the interface of interest to clients. */ class GeovinContext { /** * @type {GeovinStrategy} The Context maintains a reference to one of the Strategy * objects. The Context does not know the concrete class of a strategy. It * should work with all strategies via the Strategy interface. */ private strategy: GeovinStrategy; /** * Usually, the Context accepts a strategy through the constructor, but also * provides a setter to change it at runtime. */ constructor(strategy: GeovinStrategy) { this.strategy = strategy; } /** * Usually, the Context allows replacing a Strategy object at runtime. */ public setStrategy(strategy: GeovinStrategy) { this.strategy = strategy; } /** * The Context delegates some work to the Strategy object instead of * implementing multiple versions of the algorithm on its own. */ public doDuSomeBusinessLogic(): string { //void // ... console.log('Context: Sorting data using the strategy (not sure how it\'ll do it)'); const result = this.strategy.doAlgorithm(['a', 'b', 'c', 'd', 'e']); console.log(result.join(',')); return result.join(","); // ... } } /** * The Strategy interface declares operations common to all supported versions * of some algorithm. * * The Context uses this interface to call the algorithm defined by Concrete * Strategies. */ interface GeovinStrategy { /** * * @param data */ doAlgorithm(data: string[]): string[]; } /** * Concrete Strategies implement the algorithm while following the base Strategy * interface. The interface makes them interchangeable in the Context. */ class ConcreteStrategyA implements GeovinStrategy { /** * * @param data * @returns */ public doAlgorithm(data: string[]): string[] { return data.sort(); } } /** * */ class ConcreteStrategyB implements GeovinStrategy { /** * * @param data * @returns */ public doAlgorithm(data: string[]): string[] { return data.reverse(); } } let pubStrategy1=""; let pubStrategy2=""; let pubStrategy3="Geovin Du"; let pubStrategy4="geovindu"; /** * The client code picks a concrete strategy and passes it to the context. The * client should be aware of the differences between strategies in order to make * the right choice. */ const contextGeovin = new GeovinContext(new ConcreteStrategyA()); console.log('Client: Strategy is set to normal sorting.'); pubStrategy1=contextGeovin.doDuSomeBusinessLogic(); console.log(''); console.log('Client: Strategy is set to reverse sorting.'); contextGeovin.setStrategy(new ConcreteStrategyB()); pubStrategy2=contextGeovin.doDuSomeBusinessLogic(); let messageStrategy: string = 'Hello World,This is a typescript!,涂聚文 Geovin Du.Web'; document.body.innerHTML = messageStrategy+",<br/>one=Client: Strategy is set to normal sorting."+pubStrategy1+",<br/>two=Client: Strategy is set to reverse sorting."+pubStrategy2+",<br/>three="+pubStrategy3+",<br/>four="+pubStrategy4+",<br/>TypeScript Strategy Pattern 策略模式";
调用:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <head><title>TypeScript Hello Strategy Pattern 策略模式</title> <meta name="Description" content="geovindu,涂聚文,Geovin Du"/> <meta name="Keywords" content="geovindu,涂聚文,Geovin Du"/> <meta name="author" content="geovindu,涂聚文,Geovin Du"/> </head> <body> <script src="dist/Strategyts.js"></script> </body> </html>
输出:
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)