Java设计模式之策略模式(行为型设计模式)

Java行为型设计模式-策略模式 Java策略模式(Strategy Pattern)是一种行为型设计模式,‌它允许你在运行时改变对象的行为,而不改变其结构。这种模式的核心思想是将算法或行为封装在不同的对象中,然后让客户端在运行时选择合适的策略来执行。‌这种模式使得算法可以独立于使用它的客户端变化,‌从而增强了系统的灵活性和可维护性。‌// 定义策略接口综上,策略模式是一种行为型设计模式,‌它允许你在运行时改变对象的行为。‌这种模式的核心思想是将一系列可互换的算法封装成独立的策略类,‌并在运行时根据需要选择使用哪个策略。‌。 阅读详情

概述

先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。

作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发,也可以使用eclipse进行开发,也可以使用其他的一些开发工具。

 定义:

​    该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

结构

策略模式的主要角色如下:

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

案例实现

【例】促销活动

一家百货公司在定年度的促销活动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,由促销员将促销活动展示给客户。类图如下:

 代码如下:

/**
 * @author: xuzhilei
 * @create: 2022-01-17
 * @description: 策略接口
 **/
public  interface Strategy {
    /**
     * 抽象策略方法
     */
    void show();
}

/**
 * @author: xuzhilei
 * @create: 2022-01-17
 * @description: 具体策略A
 **/
public class StrategyA implements Strategy{
    /**
     *具体策略方法
     */
    @Override
    public void show() {
        System.out.println("买一送一");
    }
}

/**
 * @description: 具体策略B
 **/
public class StrategyB implements Strategy{
    @Override
    public void show() {
        System.out.println("满200元减50元");
    }
}


/**
 * @author: xuzhilei6656
 **/
public class StrategyC implements Strategy{
    @Override
    public void show() {
        System.out.println("满1000元加一元换购任意200元以下商品");
    }
}

/**
 * @author: xuzhilei
 * @create: 2022-01-17
 * @description: 环境角色,这里可理解为销售员
 **/
public class SalesMan {
    /**
     * 策略引用
     */
    private Strategy strategy;

    /**
     * 构造方法注入策略角色具体对象
     * @param strategy 策略角色具体对象
     */
    public SalesMan(Strategy strategy) {
        this.strategy = strategy;
    }

    /**
     * 模拟向客户展示具体活动的方法
     */
    public void SalesManShow(){
        strategy.show();
    }

}
/**
 * @author: xuzhilei
 * @create: 2022-01-17
 * @description: 场景模拟
 **/
public class Client {
    public static void main(String[] args) {
        //创建策略对象
        Strategy strategy = new StrategyC();
        //创建销售员对象
        SalesMan salesMan = new SalesMan(strategy);
        //展示具体活动策略
        salesMan.SalesManShow();
    }
}

测试结果:

优缺点

1,优点:

* 策略类之间可以自由切换

  由于策略类都实现同一个接口,所以使它们之间可以自由切换。

* 易于扩展

  增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“

* 避免使用多重条件选择语句(if else),充分体现面向对象设计思想。

2,缺点:

* 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
* 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

使用场景

* 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中。
* 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。
* 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。
* 系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
* 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。

JDK源码解析

`Comparator` 中的策略模式。在Arrays类中有一个 `sort()` 方法,如下:

public class Arrays{
    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }
}

Arrays就是一个环境角色类,这个sort方法可以传一个新策略让Arrays根据这个策略来进行排序。就比如下面的测试类。

public class demo {
    public static void main(String[] args) {

        Integer[] data = {12, 2, 3, 2, 4, 5, 1};
        // 实现降序排序
        Arrays.sort(data, new Comparator<Integer>() {
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        System.out.println(Arrays.toString(data)); //[12, 5, 4, 3, 2, 2, 1]
    }
}

这里我们在调用Arrays的sort方法时,第二个参数传递的是Comparator接口的子实现类对象。所以Comparator充当的是抽象策略角色,而具体的子实现类充当的是具体策略角色。环境角色类(Arrays)应该持有抽象策略的引用来调用。那么,Arrays类的sort方法到底有没有使用Comparator子实现类中的 `compare()` 方法吗?让我们继续查看TimSort类的 `sort()` 方法,代码如下:

class TimSort<T> {
    static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c,
                         T[] work, int workBase, int workLen) {
        assert c != null && a != null && lo >= 0 && lo <= hi && hi <= a.length;

        int nRemaining  = hi - lo;
        if (nRemaining < 2)
            return;  // Arrays of size 0 and 1 are always sorted

        // If array is small, do a "mini-TimSort" with no merges
        if (nRemaining < MIN_MERGE) {
            int initRunLen = countRunAndMakeAscending(a, lo, hi, c);
            binarySort(a, lo, hi, lo + initRunLen, c);
            return;
        }
        ...
    }   
        
    private static <T> int countRunAndMakeAscending(T[] a, int lo, int hi,Comparator<? super T> c) {
        assert lo < hi;
        int runHi = lo + 1;
        if (runHi == hi)
            return 1;

        // Find end of run, and reverse range if descending
        if (c.compare(a[runHi++], a[lo]) < 0) { // Descending
            while (runHi < hi && c.compare(a[runHi], a[runHi - 1]) < 0)
                runHi++;
            reverseRange(a, lo, runHi);
        } else {                              // Ascending
            while (runHi < hi && c.compare(a[runHi], a[runHi - 1]) >= 0)
                runHi++;
        }

        return runHi - lo;
    }
}

上面的代码中最终会跑到 `countRunAndMakeAscending()` 这个方法中。我们可以看见,只用了compare方法,所以在调用Arrays.sort方法只传具体compare重写方法的类对象就行,这也是Comparator接口中必须要子类实现的一个方法。
 

【重温设计模式】策略模式及其Java示例 生活充满了选择,而这些选择往往会塑造我们的命运。策略模式就是这样一种设计模式,它帮助我们在面对多种算法或策略时,能够做出灵活的选择,而无需改变代码的结构。这种设计模式在很多实际的开发场景中都发挥了重要的作用。策略模式的优点是显而易见的,它可以避免使用多重条件选择语句,提高算法的复用性和灵活性。然而,它也有其缺点,主要是客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这无疑增加了客户端的复杂性,尤其是在策略类数量较多的情况下。然而,我们要明白,没有哪一种设计模式是完美的,它们都有自己的优点和缺点。 阅读详情

相关推荐

23种设计模式-策略(Strategy)设计模式

软考中级-软件设计师 策略设计模式

片言可决讼,半纸能缚龙 2247

设计模式:策略设计模式

策略设计模式(Strategy Pattern)是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以让算法的变化独立于使用算法的客户端。定义一个抽象的策略接口或抽象类,其中声明了一个抽象的算法方法。定义一个环境类,持有一个抽象策略类的引用,用于调用具体的策略类中实现的算法。策略设计模式是一种非常实用的设计模式,它可以让我们在程序运行过程中动态地切换算法,从而提高程序的灵活性和可扩展性。

weixin_44251099的博客 2838

java 策略模式的小例子

java 策略模式的简单小例子,可以帮助了解策略模式的使用

设计模式-策略模式(Strategy)

策略模式是一种行为型设计模式,它定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换或独立于使用它的客户而变化。这种类型的设计模式属于行为型模式。当在处理一项业务时,如果有多种处理方式,并且需要再运行时决定使用哪一种具体实现,就会使用策略模式。策略模式的主要组成部分包括抽象策略(Strategy)类、具体策略(Concrete Strategy)类和环境(Context)类。抽象策略类是策略接口,定义了所有支持的算法;具体策略类是实现了抽象策略接口的类,表示每种具体的算法;

miaoyl的博客 5044

现控报告-- 分析倒立摆系统稳定性、能控性及能观性分析,设计PID控制方案(附matlab)

建立直线一级倒立摆系统的动力学模型,推导该系统的运动方程,求出直线一级倒立摆系统传递函数模型及空间状态方程模型。接着描述了PID控制系统设计原理及PID控制器各校正环节的作用,简要叙述了参数的整定方法。设计了直线一级倒立摆摆杆摆角及小车位置常规单回路控制器,通过Simulink仿真知道常规单回路控制器能控制摆杆摆角,不能控制小车位置。于是设计出了直线一级倒立摆双闭环控制器及基于倒立摆系统的状态空间方程控制器,利用软件进行仿真,仿真结果表明,常规双闭环控制方案和基于状态空间方程加控制方案均能对摆杆摆角及小车位

mengshenglo的博客 4万+

Java全栈AI视频生成开发实战:从DeepSeek接入到剪映自动化(附完整源码)

【代码】Java全栈AI视频生成开发实战:从DeepSeek接入到剪映自动化(附完整源码)

weixin_39169967的博客 4144

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 策略模式(Strategy) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 策略模式(Strategy) 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

Z 575

在WinXP操作系统上安装Tornado2.2详细教程

使用VxWorks的人都想在自己的电脑中装VxWorks的编译器Tornado,然而Win10操作系统对于Tornado并不友好,根本装不成功。而对于Win7操作系统,之前在实验室一台Win7上装Tornado成功过,并且一直在上面进行vx开发,但是过一段时间在其他Win7上装Tornado时又不能成功,由此说明Tornado对于Win7操作系统对Tornado的兼容也不是很好,所以想要长久使用T...

weixin_43822311的博客 4479

Java设计模式 —— 【行为型模式】策略模式(Strategy Pattern) 详解

策略模式是一种行为模式,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

知唔猪的博客 1306

ANSYS Fluent 2023R2实战:用欧拉多相流模型搞定流化床模拟(附详细参数避坑)

本文详细解析了ANSYS Fluent 2023R2中欧拉多相流模型在流化床模拟中的应用,包括模型选择、材料属性设置、相间作用力配置及初始化技巧。特别针对高颗粒浓度工况提供参数优化方案,帮助工程师提升模拟精度与效率,适用于化工、能源等领域的流化床反应器设计。

weixin_30938149的博客 267

浅谈Android MVI架构---大自然的搬运工~~~

浅谈 Android MVI架构

hong_world的博客 2152

【Java 设计模式】行为型之策略模式

策略模式是一种行为型设计模式,定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式允许客户端在运行时选择算法的具体实现,而不是在编译时固定使用某个算法。策略模式通常包含三个主要角色:环境(Context)、抽象策略(Strategy)和具体策略(ConcreteStrategy)。维护一个对抽象策略的引用,并在运行时可以切换不同的具体策略定义了一个算法族的接口,具体策略实现这个接口实现了抽象策略定义的接口,提供具体的算法实现。

好久不见的流星 2150

Hermes 教程 03:Skills 系统

摘要:Hermes Skills是一种自我改进机制,可将解决问题的经验保存为可复用技能文档。v0.13.0版本遵循agentskills.io开放标准,与Claude Skills互通。技能创建流程包括发现问题、创建技能文件、加载使用和优化更新四个阶段。系统提供技能检索和自维护机制(Curator),支持技能媒体路由和多种管理命令。内置技能涵盖开发调试、创意头脑风暴等场景,通过积累技能使Hermes更适应用户需求。

程序猿_三产 725

Java设计模式-策略模式(行为型)

策略模式是一种行为型设计模式,通过将算法的定义与使用分离,将不同的算法封装成独立的策略类,客户端可以根据需求动态选择策略。该模式的核心思想是将算法的变化独立于使用它的客户端代码,从而提升代码的灵活性和可维护性。策略模式广泛应用于需要动态切换算法的场景,如游戏中的攻击方式、士兵列队等。其结构包括策略接口、具体策略类和上下文类,客户端通过上下文类调用具体策略,实现算法的动态切换。策略模式符合开闭原则,新增算法时只需添加新的策略类,无需修改现有代码,降低了代码的耦合度。

m0_73558214的博客 1444

顶级AI大模型白嫖ChatGPT Plus1个月,0成本薅顶配功能

Chat*** Plus限时免费1个月!原价20美元/月的顶配功能

BUG猿的博客 7262

**YOLOv11性能突破:基于YOLOv10-PSA注意力机制的目标检测革命性升级**

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!

m0_71589036的博客 194

设计模式 - 行为型设计模式 - 策略模式(Java)

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net Definition Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm ...

了解➔熟悉➔掌握➔精通 5万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Java设计模式】:行为型模式—策略模式

1.策略模式应用背景 在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据应用场景的不同选择不同的算法或者策略来完成该功能。把一个类(A)中经常改变或者将来可能改变的部分提取出来,作为一个接口(B),然后在类(A)中包含这个接口(B),这样类(A)的实例在运行时就可以随意调用实现了这个接口的类©的行为。比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得...

hxcaifly的博客 281

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java设计模式之行为型模式(策略模式)介绍与说明

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式让算法独立于使用它的客户而变化,属于对象行为型模式。其核心思想是将算法的定义与使用分离,通过接口或抽象类来定义算法族,具体算法实现由具体策略类完成,客户端可以根据需要选择合适的策略。

DKPT的博客 794

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

23种设计模式-行为型模式之策略模式(Java版本)

策略模式是一种行为型设计模式,它定义了一系列算法,把它们一个个封装起来,并且使它们可以互相替换。策略模式让算法独立于使用它的客户端独立变化。

DreamCollector的博客 636

策略模式

策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况...

qq_37997523的博客 153

Java设计模式之行为型:策略模式

将类中经常改变或者可能改变的部分提取为作为一个抽象策略接口类,然后在类中包含这个对象的实例,这样类实例在运行时就可以随意调用实现了这个接口的类的行为。比如定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换,使得算法可独立于使用它的客户而变化,这就是策略模式。策略模式的优点在于可以动态改变对象的行为;但缺点是会产生很多策略类,同时客户端必须知道所有的策略类,并自行决定使用哪一个策略类;

张维鹏的博客 1万+

浅谈设计模式之策略模式

策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况...

Devil_May_Cry1995的博客 198

Java设计模式(行为型)之-策略模式

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数。策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

xiaolangfanhua的博客 434

Java23种设计模式——14.行为型模式之策略模式

Java中除去有设计原则之外,还有23中设计模式。 这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题。 并且在这些模式中,可以说是将语言的使用体现的淋漓尽致。 那我们今天要学习行为型模式中的策略模式! 策略模式 先来看看什么叫策略模式 这个模式百度百科介绍的还是可以的,但是看不太懂,我们举个栗子就可以啦 好比说我们现在要去 A 这个城市,我们可以有很多种方式过去,可以自己开车,或者坐火车,或者汽车,坐飞机等等 就类似上面这...

胖子胖子大胖子的博客 1204

12、(行为型设计模式)Java 策略模式深度学习指南

《Java策略模式深度学习指南》摘要: 本文专为Java后端开发者设计,系统讲解策略模式从原理到落地的全流程。核心围绕消除if-else嵌套,实现运行时动态切换算法。内容包含:策略模式定义(行为型设计模式)、四大优势(解耦/扩展/测试/复用)、九大典型应用场景(折扣计算/支付路由等),并通过完整代码演示基础实现到Spring集成方案。特别提供四种实现方式对比(含上下文管理、枚举策略、函数式接口等),配套中文注释示例可直接用于项目重构。最后附有SpringBoot集成方案和六大避坑指南,帮助开发者掌握这一&q

python15397的博客 780
上一篇: Java模板方法模式(行为型设计模式)
下一篇: Java命令模式(行为型设计模式)
海深不见鲸
博客等级 码龄6年 7粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值