田忌赛马中,田忌使用了博弈论中的集中优势兵力,攻击对方的要点策略,从而消除自己的弱点。
在这个场景中其实有很多的策略可以运用,但是你必须选取一种去应对。从设计角度讲:
策略通常代表一组或一簇可以相互替换的方案。当有多个策略可用时,与策略相关的逻辑必须选择其中一个策略来执行。策略模式定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式的意图在于把可选的策略或方案封装成在不同的类中,并在这些类中实现一个共同的操作。策略操作定义了策略的输入和输出,而把策略的实现工作留给各个类。这些类以不同的方案来实现同一个操作,它们为用户提供了统一的接口,因而这些类可以替换。
例子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(); }
}
