设计原则:
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
模式目的:
为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。
模式讲解:
策略模式是通过将要变换的动作提出来,封装成单独的动作类。然后创建类时将需要的动作配置到对应的动作上。如此便可以解决不同变化带来的复杂性。
实例:
创建一个抽象鸭子类。因为不同的鸭子他的飞行和声音动作会不一样,所以将其提出来。而所有鸭子都会游泳,则不需要提出来。
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 FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("I'm flying!!");
}
}
声音动作:
public interface QuackBehavior {
public void quack();
}
//嘎嘎叫
public class Quack implements QuackBehavior { public void quack() { System.out.println(“Quack”); } }
//不叫
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println("<< Silence >>");
}
}
//吱吱叫
public class Squeak implements QuackBehavior {
public void quack() {
System.out.println("Squeak");
}
}
不同的鸭子:在创建不同的鸭子时,将它所拥有的行为配置上。
//野鸭: 嘎嘎叫 会飞
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();//配置嘎嘎叫
flyBehavior = new FlyWithWings();//配置飞行能力
}
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
//橡皮鸭
public class RubberDuck extends Duck {
public RubberDuck() {
flyBehavior = new FlyNoWay();//配置不能飞行
quackBehavior = new Squeak();//配置吱吱叫
}
public void display() {
System.out.println("I'm a rubber duckie");
}
}
//诱鸭
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) {
MallardDuck mallard = new MallardDuck();
RubberDuck rubberDuckie = new RubberDuck();
DecoyDuck decoy = new DecoyDuck();
ModelDuck model = new ModelDuck();
mallard.performQuack();
rubberDuckie.performQuack();
decoy.performQuack();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
测试结果:
Quack
Squeak
<< Silence >>
I can't fly
I'm flying with a rocket