策略模式
定义了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。(来自Head First设计模式)
定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,具体类使用这个接口调用不同的算法,一般使用接口或抽象类实现。(来自百度百科)
策略模式类图
策略模式使用场景
需要做一套模拟鸭子游戏,需要实现鸭子的飞行行为和呱呱叫行为,但是鸭子的飞行行为分为会费和不会飞,呱呱叫行为分为呱呱叫、吱吱叫(橡皮鸭)和不会叫。
场景类图类图
代码实现
Duck:
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck(){
}
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("All ducks float, even decoys!");
}
}
MalardDuck:
public class MalardDuck extends Duck{
public MalardDuck(){
quackBehavior = new Quack();
flyBehavior = new FlyWithSwing();
}
@Override
public void display() {
System.out.println("I'm a real malard duck.");
}
}
FlyBehavior:
public interface FlyBehavior {
public void fly();
}
FlyWithSwing :
public class FlyWithSwing implements FlyBehavior {
@Override
public void fly() {
System.out.println("i can fly with swing!");
}
}
FlyNoWay:
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("i cann't fly!");
}
}
Quack代码略...
测试:
public class testDuck {
public static void main(String[] args) {
Duck duck = new MalardDuck();
duck.performFly();
duck.performQuack();
}
}
测试结果:
i can fly with swing!
quack quack quack ...