Strategy Pattern
问题:
设计一种子类继承超类的模式
原方案:
public class Duck { void quack(){} void swim(){} void display(){} void fly(){} } |
||
public class MallardDuck : Duck { void display(){} } |
public class RedheadDuck : Duck { void display(){} } |
public class RubberDuck : Duck { } |
问题:
这样一来, 在接下去 可能要添加的类中 不得不继承超类的所有行为, 如果有需要定义子类自己行为的, 不得不为所有需要定义的类去覆盖
所以:
将类中有变化的部分抽取出来, 跟其他不太变化的分离开来
public interface FlyBehavior { void fly(); } |
||
public class FlyWay1 : FlyBehavior { void fly(){} } |
public class FlyWay2 : FlyBehavior { void fly(){} } |
public class FlyNoWay : FlyBehavior { void fly(){} } |
public abstract class Duck
{
FlyBehavior flyBehavior;
void quack(){}
void swim(){}
void display(){}
void fly(){
flyBehavior.fly();
}
}
|
||
public class MallardDuck : Duck
{
FlyBehavior flyBehavior;
public RedheadDuck(){
flyBehavior = new FlyWay1();
}
void display(){}
}
|
public class RedheadDuck : Duck
{
FlyBehavior flyBehavior;
public RedheadDuck(){
flyBehavior = new FlyWay2();
}
void display(){}
}
|
public class RubberDuck : Duck
{
FlyBehavior flyBehavior;
public RedheadDuck(){
flyBehavior = new FlyNoWay();
}
void display(){}
}
|
结论:
封装变化
多用组合, 少用继承
针对接口编程