设计模式学习之路(一)——策略模式

【kubeEdge】离线部署 根据k8s的这个规则,可以将节点通过 label 的方式进行分组,比如将某几个节点都打上标签为 name=edge,当调度应用到 edge 节点时,会找到 label 为 edge 的所有节点,根据设置的副本数,将应用启动起来,如果设置的副本数超过了设置 edge 标签的节点数,则多出的将会显示 pending 状态,从而无法启动。清除 keadm init 或 keadm join 造成的影响均可使用 keadm reset,这个操作会删除 /etc/kubeedge 下的文件,如有需要请提前备份。 阅读详情

策略模式(Strategy Pattern)

定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

作用:用于算法之间的替换,或者功能的增加,而不会影响到其他地方。

简单举个例子,我们开发一款游戏如果有需要定义一个鸭子,会飞,会叫,那我们可能会觉得很简单,然后一开始定义就直接定义一个父类,再加一个子类实现,代码如下:

public abstract class Duck {

    protected abstract void fly();
    protected abstract void quack();
    }

子类实现:

public generalDuck extends Duck {
     protected abstract void fly(){
    System.out.println("fly with wings");
    }
    protected abstract void quack(){
    System.out.println("quacking");
    }
}

那么这个时候项目经理告诉你改需求了,又新创建了一个鸭子,它用使用火箭飞,不会叫,这个时候你又得重新创建一个类

public rocketlDuck extends Duck {
     protected abstract void fly(){
    System.out.println("fly with rocket...");
    }
    protected abstract void quack(){
    System.out.println("I can't quark);
    }
}

这个时候你会发现代码重用的效果根本就没有达到,而且如果鸭子又不想用火箭了改用飞机了或者突然不会飞了,或者其他方式时候,就得改源代码了,那么今天我们先解决这个代码重用且利于扩展的问题,这里就引出我们的策略设计模式了,那么重新定义该怎么定义呢,首先,我们把这些可变的飞行方式抽取出来,单独形成一个接口:

public interface FlyBehavior {
    public void fly();
}

其次,飞行方式我们单独实现飞行接口

public class FlyWithRocket implements FlyBehavior{

    @Override
    public void fly() {
        System.out.println("I can fly with rocket");

    }
}
public class FlyWithWings implements FlyBehavior{

    @Override
    public void fly() {
        System.out.println("I'm can fly with Wings");   
    }

}

那么我们在抽象一个共同的父类出来,定义一些每个鸭子共有的一些属性

public abstract class Duck {

    private FlyBehavior flyBehavior;//用于引用飞行实现类,实现多态变化
    private QuackBehavior quackBehavior;//暂时不用

    //用于设置飞行方式
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    public abstract void display(); 

    public void performQuack(){
        quackBehavior.quack();
    }

    public void performFly(){
        flyBehavior.fly();
    }

    //假设每只鸭子一定会游泳
    public void swim(){
        System.out.println("All ducks can swim");
    }

}

这个时候,我们定义一个特殊鸭子继承鸭子

public class SpecialDuck extends Duck {

}

接着创建特殊鸭子,一开始用翅膀飞,接着改为用火箭

Duck duck  = new MSpecialDuck();
duck.setFlyBehavior(new FlyWithWings());
duck.performFly();//使用翅膀飞

duck.setFlyBehavior(new FlyWithSocket());
duck.performFly();//使用火箭飞

具体的UML图(摘自《headfirst设计模式》):
这里写图片描述

这样即重用了代码,又降低了耦合。一举多得。
那么总结起来的话:
策略模式:建立行为族,将不同的行为分别封装,同时彼此可相互替代,算法的变化可以独立于使用者。
优点:提高了可复用性,将行为和使用者解耦出来
应用场景:
1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(具体实现可任意变化或扩充)
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

文华财经公式编程:麦语言简介及基础语法 文华财经公式语言(麦语言)是一种专门用于金融领域的编程语言,它是由文华财经公司开发的。提供了丰富的金融计算函数和数据处理功能,可以用于金融市场的数据分析、模型建立和交易策略的开发。例1:A:CLOSE;// 定义变量A为收盘价(盘中k线没有走完的时候A为最新价)。例2:MA5:=MA(C,5);// 定义收盘价的5周期均线(C为CLOSE简写)。例3:A:=REF(C,1);// 取得前一根k线的收盘价。 阅读详情

相关推荐

W25N01GV SPI NAND Flash驱动开发避坑指南:详解2KB缓冲区机制与状态寄存器正确用法

本文深入解析W25N01GV SPI NAND Flash芯片的2KB缓冲区机制与状态寄存器正确用法,提供STM32 HAL和ESP-IDF项目的实战解决方案。涵盖双阶段操作原理、状态寄存器深度解析、时序控制优化及跨平台驱动设计要点,帮助开发者避免常见错误并提升存储性能。

aizhouqian5537的博客 639

对接多种三方的设计模式_Pipeline设计模式,确定不了解一下?

Pipeline设计模式是我在来新公司才接触到的,也是在项目上广泛使用的一种东西。觉得挺有意思的,所以写一篇文章向大家介绍一下,希望大家喜欢。需求前几天小明接到一个需求,要开发一个“简单”的支付处理流程,用来处理用户下单后的一系列处理流程。这个处理流程有很多环节,包括:订单计算(包括折扣计算),金额校验,库存校验,优惠券校验,执行支付,扣减优惠券,扣减库存,通知第三方物流,通知用户付款成功,通知商...

weixin_39925813的博客 1092

NVIDIA显卡在Linux下的功率限制问题:RTX 3060 Laptop的解决方案与避坑指南

本文针对NVIDIA RTX 3060 Laptop显卡在Linux系统下遭遇功率限制的问题,提供了详细的诊断与解决方案。通过使用nvidia-smi工具监控显卡状态,并重点介绍了通过升级驱动、启用nvidia-powerd服务来激活Dynamic Boost 2.0功能,从而安全、智能地解锁额外显卡功率,有效提升性能。

weixin_29290947的博客 634

对设计模式的感悟

设计模式的出现,体现了先进的OO设计原则,这些设计原则以及设计模式的初衷都是为了拯救陷于系统维护噩梦的程序员:越来越大量的不断增加的复杂业务逻辑使得系统设计者们在OO设计中,仅仅单靠java原本的封装、抽象、继承和多态已经将他们自己置入两难的境地。一方面,OO程序设计者要求较好的代码复用性,于是将自己手头仅有的为数不多的几样工具之一——继承大肆滥用,于是将代码中间的类推向了一个固化、强耦合的不归路

jamesY 1293

QuickFix Java 实战(一)协议解析、环境搭建与首个应用

本文是QuickFix Java实战系列的第一篇,详细介绍了FIX协议的核心原理与QuickFix/J引擎的实战应用。内容涵盖FIX协议的标签化通信机制、QuickFix/J库的两种下载方法、协议定义文件解析,并通过一个完整的模拟订单发送示例,指导读者快速搭建首个FIX应用环境,实现消息生成与会话通信。

dog123的博客 495

微机原理--输入输出实验--emu8086

通过实验,验证了基本要求,实现了一位数加法运算的功能,同时实现了两位数加法运算的功能,还有一位数的除法。思考题(1)输入输出数据和计算用数据的区别:从键盘上输入以及输出的数据要在通过转化为计算机所识别的二进制的数字,和计算所用的数据之间相差30H。(2)单字符输入输出和串输入输出的不同之处:单字符的输入使用1号功能键,输出通过2号功能调用,且待显示字符送给DL寄存器;串输入使用0A功能,输出通过9号功能调用,DS:DX指向待显示字符串,且字符串必须以“$”结束。

m0_58837398的博客 2416

设计模式读书笔记与总结系列文章

设计模式读书笔记与总结系列文章目录

hacke2' Blog 3386

视觉SLAM与激光SLAM简单对比分析

本文旨在梳理目前较为前沿的SLAM技术,包括激光和视觉,主要从精度和实时性两个方面对算法进系评价。对于激光SLAM了解不深,后期需要补充相关算法的核心思想与算法框架。有问题请大佬们随时留言,我再改正。

超爱吃小蛋糕的66的博客 3854

设计模式之策略模式

一、定义策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 二、设计原则 1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。2、针对接口编程,而不是针对实现编程。3、多用组合,少用继承。 三、示例 /// <summary> /// 鸭子类 /// </summary&...

weixin_30783913的博客 102

为什么 ADT 在 SAP BTP ABAP environment 里认证成功却无法登录 Service Instance:根因拆解与一站式修复路线

摘要 ADT报错"认证成功但Service Instance登录失败"通常源于ABAP租户的权限或用户映射问题,而非账号密码错误。常见原因包括:1) ABAP租户内未创建对应业务用户;2) 业务用户缺少开发角色(如SAP_BR_DEVELOPER);3) BTP角色集合未分配或IdP组映射缺失;4) 浏览器会话混淆身份;5) 连接了非开发租户(如Customizing Tenant);6) 实例休眠导致误判。 解决方法:检查ABAP业务用户及角色分配,确认BTP角色集合映射,使用隐身窗口

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 252

基于Multisim的三相桥式全控整流电路建模、仿真与综合分析

本文基于Multisim 14.2平台,系统研究了三相桥式全控整流电路的建模与仿真方法。首先阐述了电路拓扑结构和工作原理,建立了数学模型。重点介绍了在Multisim中搭建主电路、设计六脉冲触发系统(含两种实现方案)的关键步骤,以及参数设置技巧。通过仿真分析了不同负载(阻性、阻感性)和触发角(0°-90°)下的输出特性,包括电压波形、电流谐波等性能指标。研究为电力电子教学提供了直观的仿真范例,并探讨了模型改进方向与实际工程应用价值。

huanghm88的专栏 350

设计模式学习之创建型模式学习总结

    最近在家疯狂充电,学完深入挖掘asp.net2.0的课程之后,就开始了我的《面向对象设计模式纵横谈》课程。之前对设计模式有所了解,所以这次系统去学习和实践也还是蛮有意思的! 至于为什么要学习设计模式,Gof说是应付程序设计中各种各样的需求变化,也有朋友说是为了便于程序员之间的沟通,反正我觉得有了设计模式编程就不会那么单调了。先不管那么多为什么要学了,我总结一下我第一阶段所学(创建型模式)。

小飞的专栏 1027

传导案例:某医疗仪器传导骚扰整改案例

紫外线光疗仪是一种专业的医疗设备,主要用于治疗银屑病、白癜风等皮肤疾病。该设备采用物理治疗技术,通过特定波长的紫外线照射人体来达到治疗效果。自1984年窄谱中波紫外线(NB-UVB)应用于临床以来,该技术已成为治疗早期蕈样肉芽肿(MF)的有效方法之一。作为二类医疗器械,紫外线光疗仪必须符合严格的电磁兼容性(EMC)标准,这不仅关系到设备自身的稳定运行,更关乎患者的使用安全和治疗效果。紫外线光疗仪传导骚扰整改案例充分展示了系统性EMC设计的重要性。

m0_56451176的博客 338

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

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

isskingdom的专栏 638

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

weixin_30492601的博客 236

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

设计模式一之策略模式学习笔记

设计模式一 之 策略模式 学习笔记需求开始设计设计1最终设计 阅读《Head First设计模式》来学习设计模式,以下代码都是书中的例子,通过不断的优化代码来达到学习的目的。《Head First设计模式》中的完整的代码的例子都可以在https://www.wickedlysmart.com/head-first-design-patterns/下载到。 看书是学习的一种方式,写博客是巩固学...

wangchenghao的博客 311

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

设计模式学习(一)策略模式

设计模式学习(一)策略模式策略模式定义设计原则举例分析实现 文本是阅读《Head First 设计模式》的学习记录。详细内容可以自行阅读书本 策略模式 定义   定义了算法组族,分别分装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 设计原则   1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。   2.针对接口编程,而不是针对实现编程。...

qq_37149418的博客 172

深入浅出学习设计模式之策略模式《一》

目录 深入浅出学习设计模式之策略模式《一》 深入浅出练习设计模式之装饰模式《二》   最近感觉自己上班上了很久的班,却感觉迷茫的很,思来想去,想想还是需要静下心来,回顾一下自己的知识, 今天就回顾一下自己刚开始学的设计模式,记录一下,设计模式 ,以便自己巩固复习 设计模式遵循的原则 单一原则 开闭原则 历史代还 依赖倒置 接口隔离原则 迪米特法则 1.策略模式 策略模式用...

ljh1228的博客 261

设计模式学习(一)——策略模式

一、引言 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。学习设计模式会帮助你更好的理解面向对象。 设计模式有多达23种,这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patt...

weixin_30515513的博客 112

Head First设计模式学习(一)策略模式

计划 学习一件事物之前,先想清楚再开始最好,学习计划如下: 时限:两个月(10月31日 —— 1月1日元旦假期前) 总量:13 chapters 平均时速:1 chapter/week 规律任务:每周写一篇对应章节高质量博文 学习要点: 不要只局限于此书,需要从互联网和别的地方寻找任何你感到疑惑的地方并解决,例如配合refactoring 时限意味着需要在时限内学完,就是没有任何疑问和不理解的地方,这意味着你会不只读一遍 掌握的意义(需要你在每一篇博文下面回答这些问题): 你可以回答出以下问题

weixin_43264900的博客 238

设计模式学习一:策略模式

#coding=utf8 class FlyBehavior(object): def fly(self):pass class QuackBehavior(object): def quack(self):pass class FlyWithWings(FlyBehavior): def fly(self): retu...

weixin_33670713的博客 79

电子保险丝+MCU实现嵌入式电源路径保护:TPS259483与MKV58协同设计

在嵌入式系统与工业设备中,电源路径的可靠性与瞬态响应能力直接决定整机稳定性。传统保险丝或负载开关难以应对浪涌电流、过压尖峰及故障反馈缺失等问题,而电子保险丝(eFuse)作为集成功率开关与保护逻辑的智能器件,凭借可编程限流、毫秒级关断及故障输出特性,成为工业PLC、伺服驱动、车载终端等场景下的关键防护手段。理解eFuse电流检测、过压/欠压锁定与反向电流保护原理,是设计高可靠供电链路的基础。进一步结合以MKV58为代表的Cortex-M7工业MCU,可构建软硬件协同的电源路径保护体系:硬件层实现微秒级物理切

weixin_34226182的博客 276

设计模式_STRATEGY

期末考期间实在无聊,不想看那些本学期无聊的课程,随便应付下能过的,于是坐在图书馆,书架上抓了本《Head First: Design Pattern》  先说这确实是本好书,不愧是JOLT大奖得主,O'RELLY出品,必属精品(虽然这句话是用来形容暴雪的),但书中那样趣味的写法和图示一扫我之前对设计模式的理解障碍。之前看的那些图书,你必定有一定的OO代码编写经验,而且一个个枯燥的类图,你根本无法记...

miracle9i的专栏 129

设计模式学习笔记①-策略模式

今天我看《Head First 设计模式》学到了第一个设计模式-策略模式,写篇博客来总结一下: 策略模式的定义和使用场景 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。 分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话...

qq_31984717的博客 156

设计模式学习(一)、策略模式

策略模式 定义了算法族,分别分装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 设计原则 1、找出应用可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 2、针对接口编程,而不是针对实现编程。 3、多用组合,少用继承。 个人理解 策略模式的目的是想让我们在软件编码初期多想想那些地方变化的可能性大,我们把那些需要变化提取出来包装成一个模块,通

qq_27057937的博客 181

java设计模式学习之(一)策略模式

策略模式: 将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。并使他们可以相互替换,从而导致客户端程序独立于算法的改变。 策略模式中的设计原则:变化的抽象成接口;面向接口编程而不是面向实现编程。 为什么要使用策略模式: 在开发程序过程中经常会遇到这种情况,要实现一个功能需要多个不同类型的校验,检测,或者计算规则或者查找和排序,我们最最普通是实现方式是利用if

Alice_qixin的博客 462
上一篇: MyBatis 学习总结(五)—— 一对一关联表查询
下一篇: MyBatis 学习总结(六)——一对多联表查询
programer_bei
博客等级 码龄11年 13粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值