从一个小鸭子程序开始
在<<Head First设计模式>>中,首先引入了一个需求:部分鸭子添加会飞的属性。
在传统的继承模式中,如果在父类中定义该行为,则所有子类都会具有该行为,这显然不符合需求;
那么使用接口呢?定义飞的行为接口,让会飞的鸭子类都实现这个接口。这样又会导致飞的行为有改动时,牵一发而动全身,要修改所有实现了该接口类的行为。显然不易于后期扩展维护。
策略模式实现
实现图.pngDuck类
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的额外特征和行为
}
聊聊策略模式
策略模式通过实现一组行为(如鸭子如何去飞),且各个行为之间可互相替换。使得行为的拥有者不会因为行为的变动而改变,实现了这组行为与行为拥有者之间解耦。
实现
- 将该组行为从原有代码中抽离【找出应用中可能变化之处,将变化的代码和不需要变化的代码分离】
- 如何关联行为和行为拥有者【多用组合,少用继承】
通过组合方式,使该拥有者获得该行为。 - 行为间可互相替换【针对接口编程,而非针对实现编程】
设置行为函数传入参数为该组行为的抽象(抽象类或接口),而非某个具体实现类。
网友评论