首先来看个例子,
public class duck{
public void fly(){
}
public void quack(){
}
public abstract void desc(){
}
}
这是我一般设计的duck class用来描述一般的duck,一些其他的duck可以extend this
eg public class GreenHeadDuck{
public void desc(){
System.out.println("I have green head");
}
//继承了duck中的fly和quack方法(也是duck的行为)而在desc()中添加了自己的描述
但是并不是每个duck的子类都能进行fly和quack的行为,怎么办???
我第一想到的是:继承的方法中什么都不写就行了嘛!!
public void fly() {
//I can't fly
}
但是,一旦这样每写一个不能fly 的duck就要覆盖一遍,而且并不是所有的duck的quack行为是一致的怎么办??
我想的是:那就每个覆盖一遍
这简直是疯了!!!!I'm out of my mind 这样要做多少effort
这里碰到的情况可以这样来说: 我想要抽象,这是OO要求的,但是对于复杂多变的情况没有很好的解决
怎么办?????
OO第一个原则:
抽象出变化的部分,使之与不变的部分分开
解决之道: 将变化的行为抽象成接口,为什么是接口而不是类
OO第二个原则:
面向接口编程,而不是实现
那么是否只要有这个行为的方法实现这个接口就行了呢 ??
开始想象好像是,但是仔细一想就不行了,你一个duck有多少行为,难道都要实现不是烦死了
那怎么办??
组合是解决的方法
将行为组合进duck中
public class GreenHeadDuck extends duck{
FlyBeavhier fly;
QuackBeavhier quack;
public void desc(){
}
}
现在我只要写一些fly的不同的行为
即一系列实现FlyBeavhier的类,用来描述不同duck的fly行为
而且这些行为可以动态的改变(接口实现的,set方法就可以了)
多用组合而不是继承来复用是OO 的第三个原则
这里可以总结策略模式了:
策略模式就是将一系列的行为,实现行为的算法簇,将行为接口组合进对象中,并可动态改变