策略模式

从一个小鸭子程序开始

在<>中,首先引入了一个需求:部分鸭子添加会飞的属性。
在传统的继承模式中,如果在父类中定义该行为,则所有子类都会具有该行为,这显然不符合需求;
那么使用接口呢?定义飞的行为接口,让会飞的鸭子类都实现这个接口。这样又会导致飞的行为有改动时,牵一发而动全身,要修改所有实现了该接口类的行为。显然不易于后期扩展维护。

策略模式实现

实现图.png

Duck类

type Duck struct {
    flyBehaviour FlyBehaviour
}

func (d *Duck) setFlyBehaviour(flyBehaviour FlyBehaviour) {
    d.flyBehaviour = flyBehaviour
}

func (d *Duck) PerformFly() {
    d.flyBehaviour.fly()
}

飞行行为类

type FlyBehaviour interface {
    fly()
}

type FlyWithWings struct {
}

func (f FlyWithWings) fly() {
    fmt.Println("I can fly!")
}

type FlyNoWay struct {
}

func (f FlyNoWay) fly() {
    fmt.Println("I can't fly!")
}

具体Duck实现类

type ModelDuck struct {
    Duck
    //ModelDuck的额外特征和行为
}

聊聊策略模式

策略模式通过实现一组行为(如鸭子如何去飞),且各个行为之间可互相替换。使得行为的拥有者不会因为行为的变动而改变,实现了这组行为与行为拥有者之间解耦。

实现

  • 将该组行为从原有代码中抽离【找出应用中可能变化之处,将变化的代码和不需要变化的代码分离】
  • 如何关联行为和行为拥有者【多用组合,少用继承】
    通过组合方式,使该拥有者获得该行为。
  • 行为间可互相替换【针对接口编程,而非针对实现编程】
    设置行为函数传入参数为该组行为的抽象(抽象类或接口),而非某个具体实现类。

你可能感兴趣的:(策略模式)