• 13设计模式-行为型模式-策略模式


    概述

    策略(Strategy)模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。属于对象行为模式。
    在这里插入图片描述
    策略模式的主要角色如下。
    抽象策略(Strategy)类:公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
    具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
    环境(Context)类:持有一个策略类的引用,最终给客户端调用。

    讲人话

    • 1、是讲某一种事件中的各种行为抽象到接口中,对于不同的人干这同一种事情会有不同的结果。
    • 2、电商整个环境去不同的渠道干同样的事:抽象下单,售后,物流,商品同步。。。
    • 3、代码模拟,以吃鸡的m4和awm为例

    coding

    package com.xusj.future.behavioral.strategy;
    
    /**
     * 抽象出策略,抽象出具体的一些行为,游戏中枪
     *
     * @author xusj
     * 
    CreateDate 2022/8/5 23:38 */
    public interface GameStrategy { /** * 打架 */ void fight(); /** * 防御 */ void defense(); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    package com.xusj.future.behavioral.strategy;
    
    /**
     * 枪。m4
     *
     * @author xusj
     * 
    CreateDate 2022/8/5 23:41 */
    public class M4a1strategy implements GameStrategy { @Override public void fight() { System.out.println("我是枪m4战斗力"); } @Override public void defense() { System.out.println("m4防御值"); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    package com.xusj.future.behavioral.strategy;
    
    /**
     * 枪AWM
     *
     * @author xusj
     * 
    CreateDate 2022/8/5 23:42 */
    public class AwmStrategy implements GameStrategy { @Override public void fight() { System.out.println("我是AWM战斗力111000000000"); } @Override public void defense() { System.out.println("我是AWM防御力111000000000"); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    package com.xusj.future.behavioral.strategy;
    
    /**
     * 环境游戏类,组合策略。环境类重要,后面都是通过环境类来执行策	    略的
     *
     * @author xusj
     * 
    CreateDate 2022/8/5 23:45 */
    public class ContextGame { // 属性组合 private GameStrategy gameStrategy; // 构造器多态 public void setGameStrategy(GameStrategy gameStrategy) { this.gameStrategy = gameStrategy; } public void startGame() { System.out.println("游戏开始....."); //游戏策略 gameStrategy.fight(); gameStrategy.defense(); System.out.println("win......"); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    package com.xusj.future.behavioral.strategy;
    
    /**
     * @author xusj
     * 
    CreateDate 2022/8/5 23:48 */
    public class MainTest { public static void main(String[] args) { // 使用环境类去完成不同的策略 ContextGame contextGame = new ContextGame(); // 策略一 contextGame.setGameStrategy(new M4a1strategy()); contextGame.startGame(); // 策略二 contextGame.setGameStrategy(new AwmStrategy()); contextGame.startGame(); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    使用场景

    什么场景用到?
    使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句
    什么是Spring的 InstantiationStrategy
    线程池拒绝策略

    总结

    策略模式本身比较好理解,但通常其并不单独使用,而是结合工厂模式进行使用,本文中的实例利用枚举,其实也是工厂的一种简单表示

  • 相关阅读:
    CSS整理
    【距离注意残差网络:超分】
    免费玩云上大数据--海汼部落实验室
    python+django餐厅外卖点餐系统Vue307
    信息学奥赛一本通2062:【例1.3】电影票
    多图深度解析ArrayList源码
    【工程应用八】终极的基于形状匹配方案解决(小模型+预生成模型+无效边缘去除+多尺度+各项异性+最小组件尺寸)
    CleanMyMac X4.14.7永久免费Mac电脑清理和优化软件
    mockito 的 InjectMocks 和 Mock 有什么区别?
    「 网络安全常用术语解读 」什么是0day、1day、nday漏洞
  • 原文地址:https://blog.csdn.net/weixin_46643875/article/details/126187587