策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
个人理解:策略模式就是把父类中需要根据不同情况而变化的行为想成“一族算法”,并把它抽象出来变成两个接口,在父类中包含这个接口类型的属性,这样就可以利用不同的接口实现类来改变这个行为。并且添加了getter,setter方法后可以在运行时随意改变行为的实现,这样就可以使我们的设计更加富有弹性,可以使我们的设计更加易于维护和扩展。
实例代码:
要求:所有的各类鸭子继承一个超类,并且可以拥有自己的特性,可以因为需求变化而改变某个鸭子或某一类鸭子的某种特性(如可以改变叫声和飞行状态)。
//鸭子超类
public abstract class Duck {
//飞行状态算法族
FlyBehavior flyBehavior;
//鸣叫状态算法族
QuackBehavior quackBehavior;
public Duck() {
}
//改变算法组状态的方法,可是在运行时改变特性的方法
public void setFlyBehavior (FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
//由子类继承并实现的鸭子特性(不会改变)
abstract void display();
//由子类继承的飞行和鸣叫方法
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("All ducks float, even decoys!");
}
}
//飞行接口
public interface FlyBehavior {
public void fly();
}
//飞行状态实现类(不能飞)
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("I can't fly");
}
}
//火箭助推器
public class FlyRocketPowered implements FlyBehavior {
public void fly() {
System.out.println("I'm flying with a rocket");
}
}
//鸣叫接口
public interface QuackBehavior {
public void quack();
}
//鸣叫状态实现类(不能叫)
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println("<< Silence >>");
}
}
//一个模型鸭的子类,在创建时指定特性
public class DecoyDuck extends Duck {
//在构造器中指定飞行特性和鸣叫特性(不能飞,不能叫)
public DecoyDuck() {
setFlyBehavior(new FlyNoWay());
setQuackBehavior(new MuteQuack());
}
public void display() {
System.out.println("I'm a duck Decoy");
}
}
//测试程序
public class MiniDuckSimulator {
public static void main(String[] args) {
DecoyDuck decoy = new DecoyDuck();
decoy.performQuack();
decoy .performFly();
//运行时把飞行状态改为火箭助推器飞行
decoy .setFlyBehavior(new FlyRocketPowered());
decoy .performFly();
}
}