• 设计模式 - 行为型模式考点篇:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)


    目录

    一、行为型模式

    1.1、策略模式

    1.1.1、概论

    1.1.2、案例实现

    1.1.3、优缺点

    1.1.4、使用场景


    一、行为型模式


    1.1、策略模式

    1.1.1、概论

    策略模式设计的每一个算法都封装了起来,使他们可以相互替换,通过一个对象委派不同的算法给相应的客户进行使用.

    例如一家百货公司,规定在逢年过节的时候进行促销活动.  针对不同的节日(春节、中秋节、端午节)推出不同的促销活动,然后由 促销员 将促销活动展示给客户. 

    策略模式主要角色如下:

    • 抽象策略类:由一个接口或者抽象类来实现,给出了所有 具体策略类 所需的接口.
    • 提交策略类:实现了抽下你个策略定义的接口,提供具体的算法实现.
    • 环境类:持有一个策略类引用,最终给客户端调用.

    1.1.2、案例实现

    针对以上案例进行实现.

    1. /**
    2. * 抽象策略: 促销活动接口
    3. */
    4. public interface Strategy {
    5. void show();
    6. }
    1. /**
    2. * 具体策略类: 春节活动类
    3. */
    4. public class StrategyA implements Strategy {
    5. @Override
    6. public void show() {
    7. System.out.println("春节到了,全场买一送一!");
    8. }
    9. }
    1. /**
    2. * 具体策略类: 中秋节活动类
    3. */
    4. public class StrategyB implements Strategy {
    5. @Override
    6. public void show() {
    7. System.out.println("中秋节到了,全场满 50 送月饼!");
    8. }
    9. }
    1. /**
    2. * 具体策略类: 端午节活动类
    3. */
    4. public class StrategyC implements Strategy {
    5. @Override
    6. public void show() {
    7. System.out.println("端午节到了,全场满 80 送粽子!");
    8. }
    9. }
    1. /**
    2. * 环境类: 销售员类
    3. */
    4. public class SalesMan {
    5. private Strategy strategy;
    6. public SalesMan(Strategy strategy) {
    7. this.strategy = strategy;
    8. }
    9. public Strategy getStrategy() {
    10. return strategy;
    11. }
    12. public void setStrategy(Strategy strategy) {
    13. this.strategy = strategy;
    14. }
    15. public void showAction() {
    16. strategy.show();
    17. }
    18. }
    1. public class Client {
    2. public static void main(String[] args) {
    3. //1.春节
    4. SalesMan man = new SalesMan(new StrategyA());
    5. man.showAction();
    6. System.out.println("======================");
    7. //2.中秋节
    8. man.setStrategy(new StrategyB());
    9. man.showAction();
    10. System.out.println("======================");
    11. //3.端午节
    12. man.setStrategy(new StrategyC());
    13. man.showAction();
    14. System.out.println("======================");
    15. }
    16. }

    执行结果如下:

    1.1.3、优缺点

    优点:

    • 策略类之间可以自由切换:由于策略类都实现同一个接口,所以使得他们之间可以根据不同的需求场景任意切换.
    • 易扩展,符合开闭原则:增加一个新的的策略只需要添加一个具体的策略类即可,不需要修改原有代码.
    • 避免使用多重条件选择语句(if else),充分体现面向对象设计思想.

    缺点:

    客户端必须知道所有的策略类,并自行决定使用哪个策略类.

    策略模式将造成产生多个策略类(一个策略产生一个类).

    1.1.4、使用场景

    1. 一个系统需要动态的在几种算法中选择一种时,可以将每个算法封装到策略类中.
    2. 一个类定义了多个行为,并且这些行为在这个类中以多个条件语句(if else)出现,就可以将每个分支移入他们各自的策略类中以替代这些条件语句.
    3. 每个策略算法彼此独立,要对客户隐藏具体算法实现细节.

  • 相关阅读:
    使用webSocket实现对数据的实时推送
    直播录屏软件哪个好?什么软件可以录屏直播会议?
    Retrofit
    人工智能第2版学习——盲目搜索1
    PS 切片工具 选择切片 切片存储
    基于$indexStats 构建mongodb 所有集合的索引监控程序
    数据库持久化+JDBC数据库连接
    Auracast 广播音频知识点
    【火灾检测】基于matlab GUI森林火灾检测系统(带面板)【含Matlab源码 1921期】
    YOLO系列概述(yolov1至yolov7)
  • 原文地址:https://blog.csdn.net/CYK_byte/article/details/133720072