田忌赛马中,田忌使用了博弈论中的集中优势兵力,攻击对方的要点策略,从而消除自己的弱点。
在这个场景中其实有很多的策略可以运用,但是你必须选取一种去应对。从设计角度讲:
策略通常代表一组或一簇可以相互替换的方案。当有多个策略可用时,与策略相关的逻辑必须选择其中一个策略来执行。
策略模式定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
策略模式的意图在于把可选的策略或方案封装成在不同的类中,并在这些类中实现一个共同的操作。策略操作定义了策略的输入和输出,而把策略的实现工作留给各个类。这些类以不同的方案来实现同一个操作,它们为用户提供了统一的接口,因而这些类可以替换。
例子
package com.pd.strategy;
public interface FlyBehavior {
void fly();
}
package com.pd.strategy;
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("I can't flying");
}
}
package com.pd.strategy;
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I can flying");
}
}
package com.pd.strategy;
import java.lang.reflect.Constructor;
public abstract class Duck {
FlyBehavior behavior;
public Duck() {
}
public void setFlyBehavior(FlyBehavior fb) {
behavior = fb;
}
public void setFlyBehavior(String flyBehariorClassPath) {
try {
Class clazz = Class.forName(flyBehariorClassPath);
behavior = (FlyBehavior) clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
abstract void display();
public void performFly() {
behavior.fly();
}
public void swim() {
System.out.println("All ducks float, even decoys!");
}
}
package com.pd.strategy;
public class DecoyDuck extends Duck {
public DecoyDuck(){
//setFlyBehavior(new FlyWithWings());
setFlyBehavior("com.pd.strategy.FlyWithWings");
}
@Override
void display() {
System.out.println("I'm a duck Decoy");
}
}
package com.pd.strategy;
public class Main {
public static void main(String[] args) {
DecoyDuck decoy = new DecoyDuck();
decoy.performFly();
}
}