设计模式-22策略模式

VCS的增量和分离编译 vcs的增量和分离编译 阅读详情

策略模式

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

在这里插入图片描述

案例:

​ 策略模式实现各种鸭子的飞翔能力
在这里插入图片描述

public interface Fly {
    void fly();
}

public class NoFly implements Fly {
    @Override
    public void fly() {
        System.out.println("不会飞翔");
    }
}

public class GoodFly implements Fly {
    @Override
    public void fly() {
        System.out.println("good fly技术");
    }
}

public class BadFly implements Fly {
    @Override
    public void fly() {
        System.out.println("飞翔能力不好。。");
    }
}


public abstract class Duck {
    protected Fly fly;

    public Duck() {
    }

    protected abstract void display();

    protected void fly(){
        if(fly != null){
            fly.fly();
        }
    }
}

public class PekingDuck extends Duck {
    public PekingDuck() {
        fly = new BadFly();
    }

    @Override
    protected void display() {
        System.out.println("北京鸭");
    }
}

public class WildDuck extends Duck {

    public WildDuck() {
        fly = new GoodFly();
    }

    @Override
    protected void display() {
        System.out.println("野鸭");
    }
}

public class ToyDuck extends Duck {
    public ToyDuck() {
        fly = new NoFly();
    }

    @Override
    protected void display() {
        System.out.println("玩具鸭");
    }
}

public class Client {

    public static void main(String[] args) {
        final WildDuck wildDuck = new WildDuck();
        wildDuck.display();
        wildDuck.fly();

        final PekingDuck pekingDuck = new PekingDuck();
        pekingDuck.display();
        pekingDuck.fly();


        final ToyDuck toyDuck = new ToyDuck();
        toyDuck.display();
        toyDuck.fly();
    }
}
策略模式在JDK-Arrays中的使用:
  • Arrays中的comparator就使用到了策略接口,通过对接口的不同的实现完成对array的降序或升序排序
策略模式注意事项和细节:
  • 策略模式的关键是:分析项目中变化部分和不变部分
  • 策略模式的核心思想是:多用组合、聚合,少用继承;用行为类组合,而不是行为继承,更具弹性
  • 体现了“对修改关闭,对扩展开发”原则,客户端增加行为不用修改源代码,只要添加一种策略或者行为即可,避免使用多重转移语句(if…else if…else)
  • 提供了可以替换继承关系的方法:策略模式将算法封装在独立的strategy类中,使得你可以独立于其Context改变他,使它易于切换、易于理解、易于扩展
  • 需要注意的是:没添加一个策略就要增加一个类,当策略过多时会导致类数目庞大
OCR技术解析:用Tesseract和PaddleOCR识别文本 OCR技术解析:用Tesseract和PaddleOCR识别文本 ,人工智能,计算机视觉,大模型,AI,光学字符识别(Optical Character Recognition,简称 OCR)是一项将图片、扫描件等文档中的文字信息转换为可编辑文本的技术。在数字化时代,OCR 技术广泛应用于文档处理、车牌识别、身份证识别、古籍数字化等领域,极大地提高了文字信息处理的效率。Tesseract 和 PaddleOCR 是两款极具代表性的 OCR 工具。 阅读详情

相关推荐

Ubuntu无桥接模式或连不上网(详细解决方法

目录 问题1:Ubuntu没有未桥接的主机网络适配器 解决方法 1.打开VMware安装目录下的文件 ​编辑2.右键安装以上三个文件 3.打开网络状态属性,找到VMware bridgeProtocol,点击安装 问题2.Ubuntu桥接模式连不上网 1.win+r打开cmd终端,输入ipconfig /all 2.记录以下数据 3.打开VMware网络设置 问题1:Ubuntu没有未桥接的主机网络适配器 VMWare安装之后,虚拟网络一直使用默认配置 VMnet0为...

m0_65592409的博客 6062

【c++设计模式22】行为模式7:策略模式(Strategy Pattern)

原创作者:郑同学的笔记原创地址:https://zhengjunxue.blog.youkuaiyun.com/article/details/132920283qq技术交流群:921273910# 一、定义策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。客户端代码在运行时选择所需的算法。

junxuezheng的博客 2042

别再自己造轮子了!用MONAI Model Zoo里的预训练模型,5分钟搞定医学影像AI项目

本文介绍了如何利用MONAI Model Zoo中的预训练模型快速搭建医学影像AI项目,大幅节省开发时间和计算资源。通过实战案例展示了UNet、DenseNet121等核心模型的应用技巧,帮助临床医生和研究者5分钟内启动高质量医学影像分析,特别适合小样本场景下的病灶分割和分类任务。

weixin_33704234的博客 238

.NET设计模式(22):策略模式(Strategy Pattern)

一 通过实例认识策略模式        首先让我们来说明一个问题,在软件业惟一不变的是什么呢?是变化。这是不是有点冷笑话的感觉?不管怎样,这就是事实,要想在软件行业混,我们就必须得接受这一点,我想绝大多数的程序员也是接受了这一点的,要不为什么有程序员是体力劳动者这一方法呢(当然变化只是造成程序员繁重工作的一个主要点,并不是全部原因)?     人的天性总是懒惰的,既然变化

微软新技术 1295

Godot 2D游戏开发实战:用GDScript复刻10款经典小游戏(附完整源码)

本文是一份Godot 2D游戏开发实战指南,通过使用GDScript语言复刻10款经典小游戏,帮助开发者快速掌握引擎核心功能。内容涵盖从环境配置、GDScript基础到贪吃蛇、Flappy Bird、打砖块、俄罗斯方块等项目的核心逻辑与代码实现,并附有完整源码,旨在通过实践提升独立开发能力。

gold的博客 777

R语言实战:5分钟搞定相加交互效应分析(逻辑回归/Cox回归/GLMM/GEE全支持)

本文详细介绍了如何利用R语言中的`scitable`包快速实现相加交互效应分析,支持逻辑回归、Cox回归、GLMM和GEE等多种模型。通过自动化计算RERI、AP和SI等指标,大幅提升临床研究和流行病学分析的效率与准确性,特别适合处理多因素联合作用的复杂场景。

fanta的博客 669

22种设计模式——策略模式

文章目录1. 概述2. 特点3. 实现 1. 概述 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 先从问题引入: 2. 特点 优点 缺点 使用场景 3. 实现 UML类图 Java实现 ...

meiziziLOLOLO的博客 273

Go语言全面解析:从入门到精通

Go语言是由Google开发的一种静态类型、编译型编程语言,具有简洁、高效、安全的特点。它特别适合高并发服务、云原生应用和网络编程等场景。Go采用Goroutine和Channel实现轻量级并发,性能接近C/C++。与其他语言相比,Go语法更简洁但类型更严格,编译速度快且跨平台支持好。虽然Go支持多种设计模式和编程范式,但其面向对象实现方式与传统语言不同。标准库丰富且拥有Gin、GORM等企业级框架。核心语法包括包管理、变量声明、函数定义、流程控制等,适合构建高性能后端服务和系统工具。

博哥哥的博客 4925

设计模式 22 策略模式

生活中会面临很多抉择,每一个抉择会导向不同的结果,这时就会出现策略的选择。程序中也是一样,而且更加复杂,生活中的抉择一般只有几个,但程序中可能有十多个甚至数十个,也就是我们常用的if-else或者switch。当只有少量选择时,用这些没有问题,但一旦量比较大,代码的可读性和维护难度会迅速上升,这时候就建议使用策略模式了。

天河有尽后为涯,星海无边前作岸。 180

【重识云原生】第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现

vDPA(vhost Data Path Acceleration)即是让virtio数据平面不需主机干预的解决方案。该框架由Redhat提出,实现了virtio数据平面的硬件卸载。控制平面仍然采用原来的控制平面协议,当控制信息被传递到硬件中,硬件完成数据平面的配置之后,数据通信过程由硬件设备(智能网卡)完成,虚拟机与网卡之间直通。中断信息也由网卡直接发送至虚拟机不需要主机的干预。......

junbaozi的专栏 2187

YOLOv11【第二章:核心模块进阶篇·第28节】DynamicHead动态检测头设计!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1万+

C++设计模式22——策略模式

https://blog.youkuaiyun.com/CoderAldrich/article/details/83270248 策略模式 在GOF的《设计模式:可复用面向对象软件的基础》一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。该模式使得算法可独立于使用它的客户而变化。 策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法,但是,用户需要知道各种算法的具体情况。就像上面的加班工资,不同的加班情况,有不同的算法。我们不能在程序中将计算工资

chenyijun的专栏 200

从养虾到退坑:OpenClaw 卸载不留残留,一步到位

文章摘要: 本文提供OpenClaw软件的完整卸载指南,适用于Windows、macOS和Linux系统。内容包含卸载前的数据备份步骤(配置文件、日志、插件列表),以及详细的卸载脚本。Windows版通过批处理文件删除程序文件、注册表项和环境变量;macOS/Linux版则提供shell脚本,涵盖服务停止、软件包卸载、配置清理等步骤。特别强调要删除所有用户数据(包括多用户环境),确保系统无残留。文末建议重启计算机以使更改生效,实现"一步到位"的彻底卸载。

一键难忘的博客 298

C#设计模式之22——策略模式

策略模式由一组相关的算法组成,这些算法被封装在称为Context的驱动类中。客户端程序可以选择这些不同的算法之一,或者由Context类来自动选择最合适的算法。该模式的目的是使得这些算法之间可以互换,并提供一种最合适算法的方式。该模式与状态模式的区别是,在策略模式中,用户一般会选中几个不同策略中的一个加以使用,统一时间内只能有一个i额策略被 实例化以及活动于Context的内部。然而在状态模式中,

Work Hard, Play Harder! 3138

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计模式(22)——策略模式

目录鸭子项目传统方案解决鸭子问题策略模式策略模式解决鸭子问题策略模式在JDK-Arrays应用的源码分析策略模式的注意事项和细节 鸭子项目 有各种鸭子(比如 野鸭、北京鸭、水鸭等,鸭子有各种行为,比如 叫、飞翔等) 显示鸭子的信息 传统方案解决鸭子问题 传统的设计方案(类图) 代码实现 package com.atguigu.strategy; public abstract cla...

minge0001的博客 319

lwip-2.0.3

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

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

1、

xiaoxiaoyusheng2012的专栏 2168

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

设计模式——(22)策略模式

1、定义 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。 简述:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。 2、UML类图 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。

DF10f-0001A 223

设计模式(22)-Strategy Pattern

一、 策略(Strategy)模式策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。假设现在要设计一个贩卖各类书籍的电子商务网站的购物车(Shopping Cat)系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的教材类图书实行每本一

[木子]的专栏 918

设计模式(22) 策略模式

在策略模式中,一个类的行为或算法可以在运行时动态更改。 GOF对策略模式的描述为: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients. — Design Patterns : Elements of Reusable Object-Oriented Software UML

zhixin9001的博客 178

java设计模式22 程细柱_22.java设计模式之策略模式

策略模式(Strategy)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式,在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象,策略对象改变context对象的执行算法这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出...

weixin_42139042的博客 194

Java设计模式[22]-策略模式

基本介绍 1. 策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 2. 这算法体现了几个设计原则, 第一、把变化的代码从不变的代码中分离出来; 第二、针对接口编程而不是具体类(定义了策略接口); 第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。 策略模式的原理类图 实例 鸭子项目,具体要求如下:有各种鸭子(比如 野鸭、北京鸭、水鸭等, 鸭子有各种行为,比...

JensenPWLee的博客 229

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

什么是策略模式? 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。什么时候使用策略模式? 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动

专注赚钱的程序员 319

编程-设计模式 22:策略模式

定义:策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。目的:该模式的主要目的是将一组相关的算法封装成一系列可互换的类,并使它们可以相互替换。这样,算法可以独立于使用它的客户而变化。

qq_45831414的博客 486
上一篇: 设计模式-21状态模式
下一篇: 设计模式-23职责链模式
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值