策略模式:把可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现
- 找出代码中可变的部分,把他们独立出来
- 面向接口编程
- 多用组合,少用继承
优势:
- 因为使用了组合,使构架更加灵活
- 富有弹性,可以很好的应对变化(开闭原则)
- 更好的代码复用性
- 消除大量的条件语句
劣势:
- 客户代码需要了解每个策略实现的细节
- 增加了对象的条目
代码实例:
我们有一个鸭子的超类:
鸭子有两个行为:飞和叫
不同的鸭子的行为是不同的,也就是说flyBehavior和quackBehavior是代码中可变的部分,将他们独立出来
public abstract class Duck {
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
public void performFly(){
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
public abstract void display();
void swim(){
};
}
定义fly行为的接口
public interface FlyBehavior {
void fly();
}
定义quack行为的接口
public interface QuackBehavior {
void quack();
}
/*
* 使用火箭飞行
*/
public class FlyRocketPowered implements FlyBehavior{
public void fly() {
System.out.println("i'm fly with a rocket");
}
}
写一个实现quack接口的行为类 面向接口编程
/**
* 实现呱呱叫
* @author yang
*
*/
public class Quack implements QuackBehavior{
public void quack() {
System.out.println("实现呱呱叫");
}
}
写一个ModelDuck类实现抽象原始类Duck 使用聚合
public class ModelDuck extends Duck{
public ModelDuck() {
flyBehavior = new FlyRocketPowered();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("i'm a model duck");
}
}
测试代码
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck model = new ModelDuck();
model.performQuack();
model.performFly();
model.setFlyBehavior(new FlyNoWay());
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}