您的位置:首页 > 编程语言 > Java开发

Java中的策略设计模式

2009-05-30 12:33 441 查看
田忌赛马中,田忌使用了博弈论中的集中优势兵力,攻击对方的要点策略,从而消除自己的弱点。

在这个场景中其实有很多的策略可以运用,但是你必须选取一种去应对。从设计角度讲:

 

策略通常代表一组或一簇可以相互替换的方案。当有多个策略可用时,与策略相关的逻辑必须选择其中一个策略来执行
策略模式定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
策略模式的意图在于把可选的策略或方案封装成在不同的类中,并在这些类中实现一个共同的操作。策略操作定义了策略的输入和输出,而把策略的实现工作留给各个类。这些类以不同的方案来实现同一个操作,它们为用户提供了统一的接口,因而这些类可以替换。

例子
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();
 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息