Java中的策略设计模式

    技术2022-05-13  17

    田忌赛马中,田忌使用了博弈论中的集中优势兵力,攻击对方的要点策略,从而消除自己的弱点。

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

     

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

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

    }


    最新回复(0)