【design pattern】行为型模式之— 策略模式(strategy)

    xiaoxiao2021-03-25  91

       原文:oodesign

    产生的诱因

         当 多个类 仅仅在 行为上有所不同时,这个时候可以选择 将不同的行为的实现算法 孤立 在不同的类中,以达到在运行时可以选择不同的算法的目的。

    思路

        定义一个算法族,每个算法单独封装 使他们可以互换;策略模式 让 算法 独立于 使用它的客户端。

    UML 类图

    IStrategy  接口: 所有算法族必须实现的接口,不同的算法实现在 不同的实现类中

    ConcreteStrategyA ,ConcreteStrategyB ,ConcreteStrategyC: 算法接口的不同实现

    Context 类 :  对算法的引用类;

    应用: 机器人案例

    相关类:

    IBehavior : 机器人行为的抽象

    AgressiveBehavior :攻击行为的实现

    DefensiveBehavior :防御行为的实现

    NormalBehavior:通常行为的实现

    Robot :机器人实例

    Main : 主函数入口

    IBehavior:

    package com.ycit.strategy; /** * Created by xlch on 2017/3/15. */ public interface IBehavior { public int command(); } AggressiveBehavior :

    package com.ycit.strategy; /** * Created by xlch on 2017/3/15. */ public class AgressiveBehavior implements IBehavior { @Override public int command() { System.out.println("攻击他"); return 1; } } DefensiveBehavior :

    package com.ycit.strategy; /** * Created by xlch on 2017/3/15. */ public class DefensiveBehavior implements IBehavior { @Override public int command() { System.out.println("远离他"); return -1; } } NormalBehavior :

    package com.ycit.strategy; /** * Created by xlch on 2017/3/15. */ public class NormalBehavior implements IBehavior { @Override public int command() { System.out.println("无视他,径直走开"); return 0; } } Robot:

    package com.ycit.strategy; /** * Created by xlch on 2017/3/15. */ public class Robot { private String name; private IBehavior behavior; public Robot() { } public Robot(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public IBehavior getBehavior() { return behavior; } public void setBehavior(IBehavior behavior) { this.behavior = behavior; } public void move() { System.out.print(this.name + " 在行走的过程中遇到了另一个机器人 →"); behavior.command(); } } Main:

    package com.ycit.strategy; /** * Created by xlch on 2017/3/16. */ public class Main { public static void main(String [] args) { Robot robot007 = new Robot("007"); Robot robotG = new Robot("G"); Robot robotR = new Robot("R"); robot007.setBehavior(new AgressiveBehavior()); robotG.setBehavior(new DefensiveBehavior()); robotR.setBehavior(new NormalBehavior()); robot007.move(); robotG.move(); robotR.move(); robot007.setBehavior(new DefensiveBehavior()); robot007.move(); } } 执行结果:

    007 在行走的过程中遇到了另一个机器人 →攻击他 G 在行走的过程中遇到了另一个机器人 →远离他 R 在行走的过程中遇到了另一个机器人 →无视他,径直走开 007 在行走的过程中遇到了另一个机器人 →远离他

    转载请注明原文地址: https://ju.6miu.com/read-18650.html

    最新回复(0)