设计模式学习——策略模式

面向对象设计模式学习笔记四策略模式 为什么需要策略模式 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。   举例说明 税法计算案例: 程序员要有一个时间轴的概念,不能静态的看待问题。 如果增加对法国的税法,则需要更改代码,重新编译、部署 违背了开放封闭原则:对更改封闭,对扩展开放 enum TaxBase... 阅读详情


### 基本介绍 1. 策略模式中(Stractegy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 2. 这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出去;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)

原理类图

在这里插入图片描述
对原理类图的说明,即(角色分析)
说明:从上图可以看到,客户context有成员变量strategy或者其他的策略接口,至于需要使用到哪个策略,我们可以再构造器中指定。

策略模式的实例类图

在这里插入图片描述

策略模式的代码实例

public interface FlyBehavior {

    void fly(); // 子类具体实现即可
}
public class NoFlyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println(" 不会飞翔");
    }
}
public class GoodFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞翔技术高超~~~~~~~");
    }
}
public class BadFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞翔技术一般");
    }
}
public abstract class Duck {

    //属性,策略接口
    FlyBehavior flyBehavior;

    //其他属性<->策略接口
    public Duck() {
    }

    public abstract void display();//显示鸭子信息

    public void quack() {
        System.out.println("鸭子嘎嘎叫~~");
    }

    public void swim() {
        System.out.println("鸭子会游泳~~");
    }

    public void fly() {
        if (flyBehavior != null) {
            flyBehavior.fly();
        }
    }
}
public class PekingDuck extends Duck {

    public PekingDuck() {
        flyBehavior = new NoFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("~~北京鸭~~~");
    }
}
public class ToyDuck extends Duck {

    public ToyDuck() {
        flyBehavior = new NoFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("~~玩具鸭~~~");
    }
}
public class WildDuck extends Duck {

    //构造器,传入FlyBehavor 的对象
    public WildDuck() {
        flyBehavior =new GoodFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("这是野鸭");
    }
}
public class Client {
    public static void main(String[] args) {
        WildDuck wildDuck = new WildDuck();
        wildDuck.display();
        wildDuck.fly();
        ToyDuck toyDuck=new ToyDuck();
        toyDuck.display();
        toyDuck.fly();
    }
}

策略模式在JDK-Arrays 应用的源码分析

测试用例

public class Strategy {

    public static void main(String[] args) {
        //数组
        Integer[] data = {9, 1, 2, 8, 4, 3};
        //实现升序排序,返回-1放左边,1放右边,0保持不变
        //说明
        //1. 实现了Comparator接口,匿名类 对象 new new Comparator<Integer>(){...}
        //2. 对象new new Comparator<Integer>(){..}就是实现了策略接口的对象
        //3.  public int compare(Integer o1, Integer o2){}指定具体的处理方式
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 > o2) {
                    return -1;
                } else {
                    return 1;
                }
            }
        };
        // 说明
        /**
         *
         * public static <T> void sort(T[] a, Comparator<? super T> c) {
         *         if (c == null) {
         *             sort(a);//默认方法
         *         } else {
         *             if (LegacyMergeSort.userRequested)
         *                 legacyMergeSort(a, c); //使用策略对象c
         *             else
         *                  //使用策略对象c
         *                 TimSort.sort(a, 0, a.length, c, null, 0, 0);
         *         }
         *  }
         *
         */
        //方式1:
        Arrays.sort(data, comparator);
        System.out.println(Arrays.toString(data));//升序排序后的结果

        //方式2: 同时lambda 表达式实现
        Integer[] data2 = {9, 1, 2, 8, 4, 3};

        Arrays.sort(data2, (var1, var2) -> {
            if (var1.compareTo(var2) > 0) {
                return 1;
            } else {
                return -1;
            }
        });
        System.out.println(Arrays.toString(data2));//升序排序后的结果
    }
}

策略模式的注意事项和细节

  1. 策略模式的关键是:分析项目中变化部分与不变部分
  2. 策略模式的核心思想是:多用组合/聚合 少用继承;用行为类组合,而不是行为的继承,更有弹性。
  3. 体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if…else if…else)
  4. 提供了可以替换继承关系的办法:策略模式将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展
  5. 需要注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大。
生物信息学工具链搭建:用conda一键搞定MCScanX所有依赖(Ubuntu20.04实测) 本文详细介绍了在Ubuntu20.04系统上使用conda一键部署MCScanX及其所有依赖的高效方法,解决了传统源码编译安装中的依赖冲突问题。通过conda环境管理工具,研究者可以快速搭建生物信息学工具链,实现基因组共线性分析的高效运行,显著提升研究效率。 阅读详情

相关推荐

SEW MDX61B 变频器调试说明

可手动自由更改时间和地址,时间一般不更改,IP地址使用网络适配器地址(Network adapter),点击进入即可。进入网络适配器(Network adapter)后,选择适配器建议地址,点击OK,更改IP地址后点击OK。点击加载配置文件(Load a configuration),加载已保存的应用模块配置文件, 或者点击“next”,开始重新配置AMA0801模块。满足安全回路后,控制模式选为寻参模式(Reference mode),选中开始(start),即可将机械零点设置为电气零点。

xdpcxq的专栏 4304

认真学习设计模式之策略模式(Strategy Pattern)

【1】策略模式定义 策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上。另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口来实现。 策略模式特点: 是一种行为型模式,对算法封装,使得客户端独立于各个策略 扩展性强,添加策略无非就是添加一个具体的实现类而已,代价非常低 主要解决:...

小小默:进无止境 1200

TI C2000 , .cmd文件,.TI.ramfunc,将程序分配为在RAM中运行/Flash运行的配置方法和原理讲解,(如28375S ,280049,28335等等芯片)

1 基础知识讲解 1.1 在RAM中运行还是在flash中运行指的是什么? 1.1.1 背景:程序编译完之后生成的.bin文件,.bin文件中包含代码段,代码段中全是汇编指令,而汇编指令中包含多个函数,各函数头的地址不同,如存在A函数和B函数,假设RAM地址区间是0x0000-0x8000,flash的地址区间是0xA000-0xF000,A函数要调用B函数,则A函数调用B函数的那段汇编指令中包含的是B函数头的存储地址,A函数和B函数都在flash中有存储 1.1.2 情况1:B函数是配置为在RAM中运行,

weixin_43776284的博客 8068

设计模式学习笔记--策略模式(Strategy Pattern)

设计模式第一弹,发现在继续深入学习Java相关知识前,很有必要学习下设计模式,其中几个比较重要的设计模式其实在之前的使用中已经出现过很多次,但是由于没有学过设计模式,也就知其然不知其所以然的拿来用了,所以接下来准备好好整理学习设计模式,博客整理的内容均来自《Head First 设计模式》。下面开始整理第一个设计模式–策略模式1.定义策略模式:定义了算法簇,分别封装起来,让它们之前可以互相替换,此模

classTC的博客 1282

GDI文字绘制和windows下opengl文字绘制小结

GDI绘制文字,要设置文字的属性,主要就是通过设置DC中的font对象来实现的。 font对象的创建可以由createfont()、createfontIndirect()来实现。 HFONT CreateFont( int nHeight, // height of font int nWidth, // average

T_W_S的专栏 5323

可视化大屏系列(5):设备状态面板与数据分析仪表盘

在这篇文章中,我们将重点讨论如何通过智能化手段提升工地设备的管理效率与维护质量。随着智能工地系统的不断发展,设备监控与维护管理变得尤为重要。本篇将从 设备状态实时监控、自动化维护提醒、设备管理与维修记录 三个方面入手,展示如何通过 Vue3 和 ECharts 构建一个智能化的设备管理平台,实时采集和展示设备运行状态、及时生成维护提醒并记录维修历史,以提高设备的使用效率与安全性。我们还将结合实际代码示例,详细讲解如何实现这些功能,帮助你在智能工地项目中实现设备管理的智能化、数字化和自动化。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 3365

设计模式学习——策略模式(Strategy Pattern)

0. 前言   最近在重构公司的一个项目的时候,在抽取DES加密重复部分代码的时候,突然间想起了策略模式,感觉策略模式好像可以应用上,于是重新学习了下策略模式。注:在DES加密中,有DES和TDES算法,其中又有各种分组模式,如EBC,CBC等。 1. 定义   引用百度定义:策略模式,定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它...

diaoxie6172的博客 151

AI驱动全栈开发实战:基于Spec与Codex的规格驱动开发指南

1. 先搞清楚“AI重构前端全栈”到底在解决什么实际问题 最近很多人在聊“AI重构前端全栈”,听起来像是又一个营销概念。但如果你真的拆开看,它核心解决的是一个非常具体且痛苦的问题: 一个开发者,如何从零开始,系统性地、不跑偏地完成一个完整项目,并且保证代码质量和架构一致性。 传统开发流程里,产品经理出PRD,前后端开会对齐,前端画页面,后端写接口,测试再介入。这个过程沟通成本高,文档容易过时,新人上手慢。而“AI重构”的思路,是试图用一套 规范化的指令(Spec) 来驱动AI(比如Codex这类模型)生成代

weixin_30596023的博客 460

设计模式学习总结-策略模式(Strategy Pattern)

设计模式学习总结-策略模式(Strategy Pattern) 问题: 当我们定义一系列的算法,怎么能使得算法为应对不同的业务需要能自由的动态替换而又不影响到客户端的使用,并且算法的增减、修改都不会影响环境和客户端。 定义: 策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换。该模式可使得算法能独立于使用它的客户而变化。 意图:  Strategy模式是行为模式,

香巴拉 708

离散系统傅里叶变换的常用结论证明

本文介绍了离散系统傅里叶变换的三个重要结论:1)时域卷积对应频域相乘(公式1-3);2)时域相乘对应频域卷积(公式4-6);3)帕塞瓦尔定理(公式7)及其广义形式,证明信号能量在变换域保持不变。文末提供了MATLAB卷积运算演示程序,通过动画展示离散信号卷积过程(翻转、平移、相乘、累加),并以方波信号为例给出运行结果图。该程序直观呈现了卷积运算的步骤与结果。

newtton的博客 1302

【项目实战】分布式日志系统 之 Exactly-once 语义:确保数据处理的精确性

在分布式系统的数据传输与处理中,是一种核心可靠性保障,其目标是确保数据“仅被处理一次”——既不重复(避免多次处理),也不遗漏(避免未处理)。与,二者共同保障数据处理的精确性。Exactly-once 语义是分布式系统中数据可靠性的高级目标,其核心通过“幂等设计”(解决重复问题)和“分布式事务”(解决原子性问题)实现。在实际应用中,常结合 At-Least-Once 语义与幂等性,或通过事务 API 与唯一 ID 去重的组合,平衡可靠性与系统性能。

奶爸的编程之路,也就一周冷个三天 167

设计模式学习--策略模式(Strategy Pattern)

设计模式学习--策略模式(Strategy Pattern) 什么是策略模式? 定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立使用算法的客户。 怎么使用策略模式设计程序? 分开变化和不会变化的部分,建立一组新的类来代表变化的部分。 三个设计原则: 1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 2. 针

巫山老妖 4566

华为OD机试真题 新系统 2026-04-22 Python&JS 实现【小学生班长选举增强版】

9 月份开学第一天,小学某班级进行班长选举活动,班级共有 N 个学生,每个学生最多可投 3 票(对同一个人只能投一票),也可以弃权不投票,大家投票时写上对应学生的名字。 假设学生不存在重名。考虑到部分少数民族名字带分隔,且整体较长,同学在投票时为了方便,允许同学写全称,也可以只写其中的部分连续段。 例如班级里只有 2 个少数民族名称带点的同学:

MISAYAONE的博客 317

HeadFirst 设计模式学习笔记1--策略模式

本文已搬家至【HeadFirst 设计模式学习笔记】1.策略模式

gnuhpc的专栏 5779

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

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

设计模式-策略模式(Strategy Pattern)学习总结

策略模式        定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。简单来说:我们星期天从学校去公园,有的步行过去,有的骑车过去,有的开车过去,有的做公交车过去;我们的出发点和目的地是一样的,只是过程不一样。使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种...

Infinite振 409

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

设计模式学习总结(一)策略模式Strategy Pattern

策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 继承让所有的子类都有父类的行为,如果子类的行为经常改变,让所有的子类都有父类的行为是不恰当的。 接口解决了一部分问题,让实现了接口的子类才有这类行为,但是接口不具有实现代码,无法达到代码复用,因此当需要修改一个行为的时候,必须往下追踪每个定义次行为的类来修改,容易造成新的错误。

isskingdom的专栏 638

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

反馈法学习设计模式(一)——策略模式Strategy Pattern

简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例。便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习。 首先我们通过练习,逐步写出符合相应需求的代码,再根据需求进行改进、比较、重写,最终得出一种更灵活的最佳实现。 练习 /** 该类为苹果 */ class Apple { private Floa...

weixin_30492601的博客 236

设计模式学习:模板模式 与 策略模式

这两天在看李建忠的《设计模式》课程,希望自己能坚持下去,做好记录。某人知道我在看,一个劲儿在diss我,说c++很少用设计模式,看了实在是浪费时间。但我最近看一些代码,实在困惑很多,也认识到自己写的代码还停留在c语言时代,用c++写着C。 只是某人搞java,对设计模式比较擅长,所以觉得这些都是小case吧。开始正题吧。 词汇 稳定 不变的东西: 每个设计模式都要先区分稳定和变化,有助于理...

weixin_44968076的博客 179

设计模式学习之策略模式

写代码时总会出很多的if…else,或者case。如果在一个条件语句中又包含了多个条件语句就会使得代码变得臃肿,维护的成本也会加大,而策略模式就能较好的解决这个问题,本篇博客就带你详细了解策略模式。策略模式的定义和使用场景定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替

一个码农的博客 7万+

设计模式学习之——策略模式

设计模式学习,策略模式,策略模式常见应用场景,java代码示例

github_38727595的博客 1900

设计模式之策略模式学习

基于Kafka+ElasticSearch+MongoDB+Redis+XXL-Job日志分析系统(学习)配置即权限:从传统开源 RBAC 框架到 SPARK 的六层数据护盾,告别改权限就要改代码的魔咒。c++&MFC 用boost.asio库写的串口功能,包含发送、异步接收、打开、重连、关闭功能。Windows下NVM保姆级指南:安装、切换版本、指定路径+淘宝镜像配置,一次搞定!第2集:技术选型的智慧:Flask vs FastAPI,GLM-4 vs GPT。

slngX_357zp的博客 452

设计模式学习之路--策略模式

学习背景   基于一段时间的开发,感觉日复一日的硬编码,对自己的实力的提高作用很小,只是对之前编码的一个复用,感觉总是在进行一些if else的操作。所以抽个时间来学习一下设计模式相关的东西,看看对自己编码过程中遇到的一些问题能否进行解决和改善现在编码的一些误区。入手了一本设计模式的书籍《head First 设计模式》进行学习。   策略模式介绍           什么是策略模式呢?

I've been looking for 247

设计模式——策略模式的学习与理解

什么是策略模式 通俗的来说。策略模式( Strategy Pattern)就是将算法封装到具有共同接口的独立类中,以独立与客户端,客户端可以灵活的使用或替换算法族里面不同的算法,降低了耦合性。这种类型的设计模式属于行为型模式。 这算法体现了几个设计原则: 把变化的代码从不变的代码中分离出来; 定义了策略接口,针对接口编程而不是具体类; 客户通过组合方式使用策略,而不是使用继承。 引入案例 某购...

qq_44025396的博客 465
上一篇: 编程案例——layui的table表格并获取选中的数据、layui监控select下拉框并将隐藏的div显示
下一篇: 设计模式学习——职责链模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值