继承实现了面向对象模式的“可复用”,但是可复用中缺少了灵活性和可扩展性,单纯的使用继承不止不会减少代码量,反而会增加代码复杂度,策略模式中的鸭子实例在使用了继承的前提下,添加了两个接口FlyBehavior,QuackBehavior,使属性可变,增加了超类的灵活性。
//鸭子超类
class Duck{
constructor() {
}
//游泳
swim(){
console.log('会游泳')
}
//呱呱叫(变化部分)替换成
quack:QuackBehavior;
quackBehavior():void{
this.quack.quack()
}
//外观
display(){
console.log('鸭子外观')
}
//飞 (变化部分)
fly:FlyBehavior
flyBehavior():void{
this.fly.fly()
}
}
//飞的行为接口
interface FlyBehavior{
//飞的函数
fly():any
}
//呱呱叫的行为接口
interface QuackBehavior{
//呱呱叫的函数
quack():any
}
//会飞的类继承飞的接口
class FlyWithWings implements FlyBehavior{
//飞的函数
fly():any{
console.log('会飞')
}
}
//不会飞的类继承飞的接口
class FlyNoWay implements FlyBehavior{
//飞的函数
fly():any{
console.log('不会飞')
}
}
//呱呱叫的类继承呱呱叫的接口
class Quack implements QuackBehavior{
//飞的函数
quack():any{
console.log('呱呱叫')
}
}
//吱吱叫的类继承呱呱叫的接口
class Squeak implements QuackBehavior{
//飞的函数
quack():any{
console.log('吱吱叫')
}
}
//不会叫的类继承呱呱叫的接口
class MuteQuack implements QuackBehavior{
//飞的函数
quack():any{
console.log('不会叫')
}
}
//绿头鸭子
class GreenHeadDuck extends Duck{
//构造函数
constructor() {
super();
this.fly = new FlyWithWings()
this.quack = new Quack()
}
}
//橡皮鸭子
class RubberDuck extends Duck{
//构造函数
constructor() {
super();
this.fly = new FlyNoWay()
this.quack = new Squeak()
}
}
//诱饵鸭子
class DecoyDuck extends Duck{
//构造函数
constructor() {
super();
this.fly = new FlyNoWay()
this.quack = new MuteQuack()
}
}
let gDuck = new GreenHeadDuck()
gDuck.display()
gDuck.swim()
gDuck.flyBehavior()
gDuck.quackBehavior()
let rDuck = new RubberDuck()
rDuck.display()
rDuck.swim()
rDuck.flyBehavior()
rDuck.quackBehavior()
let dDuck = new DecoyDuck()
dDuck.display()
dDuck.swim()
dDuck.flyBehavior()
dDuck.quackBehavior()