设计模式在 TypeScript 中的应用

来源:互联网 发布:网络运营主管招聘 编辑:程序博客网 时间:2024/06/04 22:13

定义

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。

实现

思路:创建表示各种策略的对象,和一个行为随着策略对象改变而改变的 context 对象。

一个简单的加减乘例子:

interface Compute {  computeF (num1: number, num2: number): number}// 创建策略对象class ComputeAdd implements Compute {  public computeF (    num1: number,    num2: number  ): number {    return num1 + num2  }}class ComputeSub implements Compute {  public computeF (    num1: number,    num2: number  ): number {    return num1 - num2  }}class ComputeMul implements Compute {  public computeF (    num1: number,    num2: number  ): number {    return num1 * num2  }}// 创建行为类class Context {  public compute: Compute  public constructor (compute: Compute) {    this.compute = compute  }  public excuteCompute (    num1: number,    num2: number  ): number {    return this.compute.computeF(num1, num2)  }}let context1 = new Context(new ComputeAdd())                  .excuteCompute(1, 2)let context2 = new Context(new ComputeSub())                  .excuteCompute(1, 2)let content3 = new Context(new ComputeMul())                  .excuteCompute(1, 2)console.log(context1, context2, content3) // 3, -1, 2

复杂一点的例子(打怪):

// 武器接口interface Weapon {  useWeapon (): void}// 技能接口interface Skill {  useSkill (): void}// 武器类class Gun implements Weapon {  public useWeapon () {    console.log( 'Weapon: Gun')  }}class Stick implements Weapon {  public useWeapon () {    console.log('Weapon: Stick')  }}// 技能类class Magic implements Skill {  public useSkill () {    console.log('Skill: Magic')  }}class Kongfu implements Skill {  public useSkill () {    console.log('Skill: Chinese Kongfu')  }}// 抽象类,用于给其他类继承abstract class Way {  // 武器  public weapon: Weapon  // 技能  public skill: Skill // 设置武器  public setWeapon (weapon: Weapon): void {    this.weapon = weapon  }  // 设置技能  public setSkill (skill: Skill): void {    this.skill = skill  }  public getWeaponAndSkill (): void {    this.weapon.useWeapon()    this.skill.useSkill()  }  // 抽象方法  public abstract saySome (): void}class SimpleWay extends Way {  public constructor () {    super()    this.weapon = new Gun()    this.skill = new Magic()  }  public saySome () {    console.log('屠龙宝刀,点击就送')  }}const way = new SimpleWay()way.saySome()console.log('=======')way.getWeaponAndSkill()console.log('=======')way.setWeapon(new Stick)way.setSkill(new Kongfu)way.getWeaponAndSkill()
原创粉丝点击