Typescript描述策略模式

本文介绍了策略模式的概念,通过TypeScript演示了如何在鸭子模拟游戏中应用策略模式,允许飞行行为的灵活替换和动态调整,提高了代码的可维护性和弹性。文章遵循设计原则,强调接口编程和组合使用,指出抽象类和抽象方法在策略模式中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先澄清策略模式概念:

策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客
户。

HeadFirst设计模式中基于SimUDuck游戏介绍使用策略模式实现鸭子的飞行与叫声两个行为。通过为鸭子实现飞行方法进入主题,有的鸭子会飞,有的鸭子不会飞,具体的鸭子实现是通过继承自Duck基类实现,在基类中定义了鸭子飞行的行为,若子类鸭子中没有飞行行为,比如橡皮鸭,则需要再次实现飞行方法以覆盖父类中定义过得行为。又或者不同子类的鸭子飞行的方式不一样,则也需要单独在子类中重新覆盖父类的方法。而且,若日后鸭子的飞行行为发生了变化,则还需要在子类中逐个修改飞行方法,况且还不能再执行过程中动态改变鸭子的飞行行为。这样的实现非常不具有弹性,况且日后维护起来也比较麻烦。

为了消化策略模式,本文基于TypeScript演示策略模式的应用。

执行 tsc strategyModel.ts 生成对应的js文件;
执行 node strategyModel.js运行

abstract class FlyBehavior {
    constructor() {}
    abstract fly(): void;
}

class FlyHigher extends FlyBehavior {
    constructor() {
        super();
    }
    fly() {
        console.log('flying up ground 100 meter');
    }
}

class NoFly extends FlyBehavior {
    constructor() {
        super();
    }
    fly() {
        console.log('I can not flying');
    }
}

class FlyLow extends FlyBehavior {
    constructor() {
        super();
    }
    fly() {
        console.log("flying up ground 10 meter");
    }
}

abstract class SnarlBehavior {
    constructor() {}
    abstract snarl();
}

class BirdSnarl extends SnarlBehavior {
    constructor() {
        super();
    }
    snarl() {
        console.log('jiji');
    }
}

class DogSnarl extends SnarlBehavior {
    constructor() {
        super();
    }
    snarl() {
        console.log('wang wang');
    }
}
abstract class Animal {
    snarlBehavior: SnarlBehavior;
    flyBehavior: FlyBehavior;
    constructor () {}
    abstract display();
    makeSound() {
        this.snarlBehavior.snarl();
    }
    fly() {
        this.flyBehavior.fly();
    }
}

class Dog extends Animal {
    constructor() {
        super();
        this.flyBehavior = new NoFly();
        this.snarlBehavior = new DogSnarl();
    }
    display() {
        console.log('black dog');
    }

    setFlyBehavior(newFlyBehavior: FlyBehavior) {
        this.flyBehavior = newFlyBehavior;
    }
}

class Eagle extends Animal {
    constructor() {
        super();
        this.flyBehavior = new FlyHigher();
        this.snarlBehavior = new BirdSnarl();
    }

    display() {
        console.log('white eagle');
    }
}

let dog: Dog = new Dog();
dog.fly();                          // I can not flying
dog.makeSound();                    // wang wang
let flyLow = new FlyLow();
dog.setFlyBehavior(flyLow);         // 动态改变dog的飞行行为,使其可以飞行
dog.fly();                          // flying up ground 10 meter

let eagle: Eagle = new Eagle();
eagle.fly();                        // flying up ground 100 meter
eagle.makeSound();                  // jiji 

若是想修改某一类飞行方法,则直接在相应的飞行子类中修改即可。策略模式中用到了类的多态性质,即定义了一个基类型的变量,在运行时才对其赋值,将具体的子类对象赋值给该变量。

常用设计准则:
1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不变的代码混在一起。
2. 针对接口编程,而不是针对具体实现编程。
3. 多用组合,少用继承。

关于抽象类与抽象方法:

本例中,声明了FlyBehavior抽象类,定义了fly抽象方法,注意抽象方法只能定义在抽象类中。抽象类不能实例化对象,抽象类中定义的抽象方法必须在子类中实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值