• java设计模式之策略模式


    一:策略模式

    1.什么是策略模式?
    模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。
    策略模式的基本介绍
    1.策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
    2.这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。

    2.策略模式适合应用场景
    1.当你想使用对象中各种不同的算法变体, 并希望能在运行时切换算法时, 可使用策略模式。
    2.当你有许多仅在执行某些行为时略有不同的相似类时, 可使用策略模式。
    3.如果算法在上下文的逻辑中不是特别重要, 使用该模式能将类的业务逻辑与其算法实现细节隔离开来。
    4. 当类中使用了复杂条件运算符以在同一算法的不同变体中切换时, 可使用该模式。
    5. 程序种有大量if/else的语句

    3.策略模式优缺点
    优点:
    1.你可以在运行时切换对象内的算法。
    2.你可以使用组合来代替继承。
    3.开闭原则。 你无需对上下文进行修改就能够引入新的策略。
    缺点:
    1.在封装器栈中删除特定封装器比较困难。
    2.实现行为不受装饰栈顺序影响的装饰比较困难。
    3.各层的初始化配置代码看上去可能会很糟糕。

    4.策略模式角色:
    抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
    具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
    环境(Context)类:持有一个策略类的引用,最终给客户端调用

    二:策略模式代码实现

    案例:促销活动
    一家百货公司在定年度的促销活动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,
    由促销员将促销活动展示给客户。类图如下:
    在这里插入图片描述
    抽象策略

    
    /**
     * @Author cgz
     * @Date 2022/11/17 16:58
     */
    public interface Strategy {
        void show();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    具体策略

    /**
     * @Author cgz
     * @Date 2022/11/17 16:58
     */
    //春节活动
    public class StrategyA implements Strategy{
        @Override
        public void show() {
            System.out.println("买一送一");
        }
    }
    
    /**
     * @Author cgz
     * @Date 2022/11/17 16:58
     */
     //中秋活动
    public class StrategyB implements Strategy{
        @Override
        public void show() {
            System.out.println("买一送二");
        }
    }
    
    
    /**
     * @Author cgz
     * @Date 2022/11/17 16:58
     */
     //圣诞节活动
    public class StrategyC implements Strategy{
        @Override
        public void show() {
            System.out.println("买一送三");
        }
    }
    
    
    • 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    环境

    /**
     * @Author cgz
     * @Date 2022/11/17 16:59
     */
    public class SalesMan {
        //持有抽象策略角色的引用
        private Strategy strategy;
        public SalesMan(Strategy strategy) {
            this.strategy = strategy;
        }
        //向客户展示促销活动
        public void salesManShow(){
            strategy.show();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    
    
    • 1
  • 相关阅读:
    计算机网络笔记-IPv4地址相关
    安全+Linux!IBM新一代大型机Z14全新发布
    QT简单串口通信终端实现
    YOLOv5使用方法记录
    如何写论文
    [附源码]java毕业设计基于的图书馆管理系统
    postman连接mysql报ETIMEDOUT错误解决方法
    ESP8266-Arduino编程实例-BME680环境传感器驱动
    基于Java毕业设计服务管理系统源码+系统+mysql+lw文档+部署软件
    企业是如何搭建帮助中心的?
  • 原文地址:https://blog.csdn.net/m0_47944994/article/details/127903106