策略模式
分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。
设计原则
分离变化部分,针对接口编程,多用组合,少用继承。
示例:模拟鸭子游戏
提取变化部分(behavior)设计成接口,实现算法族,假如变化部分为fly和quack
flybehavior接口
public interface FlyBehavior {
void fly();
}
实现算法族
public class BadFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--BadFly--");
}
}
public class GoodFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--GoodFly--");
}
}
public class NoFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--NoFly--");
}
}
quackbehavior接口
public interface QuackBehavior {
void quack();
};
实现算法族
public class GaGaQuackBehavior implements QuackBehavior
{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("__GaGa__");
}
}
public class GeGeQuackBehavior implements QuackBehavior
{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("__GeGe__");
}
}
public class NoQuackBehavior implements QuackBehavior
{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("__NoQuack__");
}
}
duck超类
public abstract class Duck {
FlyBehavior mFlyBehavior;
QuackBehavior mQuackBehavior;
public Duck() {
}
public void Fly() {
mFlyBehavior.fly();
}
public void Quack() {
mQuackBehavior.quack();
}
public abstract void display();
public void SetQuackBehavoir(QuackBehavior qb) {
mQuackBehavior = qb;
}
public void SetFlyBehavoir(FlyBehavior fb) {
mFlyBehavior = fb;
}
public void swim() {
System.out.println("~~im swim~~");
}
}
GreenHeadDuck子类
public class GreenHeadDuck extends Duck {
public GreenHeadDuck() {
mFlyBehavior = new GoodFlyBehavior();
mQuackBehavior = new GaGaQuackBehavior();
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("**GreenHead**");
}
}
RedHeadDuck子类
public class RedHeadDuck extends Duck {
public RedHeadDuck() {
mFlyBehavior = new BadFlyBehavior();
mQuackBehavior = new GeGeQuackBehavior();
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("**RedHead**");
}
}
测试Test
public static void main(String[] args) {
Duck greenDuck=new GreenHeadDuck();
greenDuck.display();
greenDuck.Fly();//旧fly
greenDuck.SetFlyBehavoir(new BadFlyBehavior());
greenDuck.Fly();//新fly
greenDuck.Quack();
greenDuck.SetQuackBehavoir(new NoQuackBehavior());
greenDuck.Quack();
greenDuck.swim();
}
**GreenHead**
--GoodFly--
--BadFly--
__GaGa__
__NoQuack__
~~im swim~~