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

从原理到落地:Java+TensorRT打造YOLO模型GPU极致推理方案 Java+TensorRT的YOLO模型GPU加速方案,核心是通过JNI桥接实现Java与TensorRT的高效交互,结合TensorRT的底层优化能力,最大化GPU算力。该方案既保留了Java后端的工程化优势(如易维护、生态完善),又解决了AI模型推理的性能瓶颈,可落地于实时视频分析、智能监控、工业质检等场景。基于TensorRT Dynamic Shape实现多尺寸输入的自适应优化;结合Java的协程(Virtual Thread)提升异步推理的并发效率; 阅读详情


更多关于设计模式的文章请点击:设计模式总结


一、进一步的改进

上面的动物园例子似乎已经足够地完善了,但是仔细想想并不是这样:当另一个SmallDog被创建时,它实现了BarkBehavior接口,但是它需要在自身的代码中去重写这个bark()方法,这个bark()方法的具体实现暴露在了SmallDog类中,当我们需要修改SmallDog的bark()方法实现时,我们需要在这个类中去修改代码,这就造成了硬编码问题,那么应该怎么解决呢?

这里引申出策略模式的一个重要思想:使用组合,而不是实现

  • BigDogBark实现类
/**
 * @Auther: ARong
 * @Date: 2018/11/17 23:10
 * @Description:
 */
public class BigDogBark implements BarkBehavior {

    @Override
    public void bark() {
        System.out.println("Big Dog 汪汪汪...");
    }
}
  • BigDog可修改为
/**
 * @Auther: ARong
 * @Date: 2018/11/17 11:09
 * @Description: com.iteason.Animal.BigDog 继承 Animal的所有属性和方法并实现BarkBehavior
 */
public class BigDog extends Animal {
    private BarkBehavior barkBehavior;

    //构造方法
    public BigDog(String name) {
        super(name);
        //在运行时将BigDogBark向上转型为BarkBehavior
        barkBehavior = new BigDogBark();
    }
    public BigDog() {
    }

    //将bark()方法的具体实现委托给BarkBehavior的子类
    public void performBark(){
        barkBehavior.bark();
    }


    public BarkBehavior getBarkBehavior() {
        return barkBehavior;
    }

    public void setBarkBehavior(BarkBehavior barkBehavior) {
        this.barkBehavior = barkBehavior;
    }
}

BigDog类中组合了一个BarkBehavior的接口,在构造方法中新建一个BarkBehavior的实现类BigDogBark,通过面向对象的特征:多态,在运行时确定由谁实现了BarkBehavior接口,并且将执行动作委托给了performBark()方法去调用barkBehavior.bark(),这就是一个简单的策略模式的应用了。

以上关系可用UML关系图来表达:
在这里插入图片描述

二、用策略模式组织类关系实例

在下面,你将看到一堆杂乱的类与接口,这是取自一个动作冒险游戏。你将看到代
表游戏角色的类,以及武器行为的类。每个角色一次只能使用一个武器,但是可以
在游戏的过程中换武器。你的工作是要弄清楚这一切…

这是HeadFirst设计模式中的一个问题,可以使用策略模式,画出一个UML图来表示他们的关系:用Character作为角色的超类,里边含有角色的共同属性以及可变的战斗武器接口、战斗模式接口对象;FightBehavior是战斗模式的接口,Quene和Random分别实现了队列战斗模式和随机战斗模式;WeaponBehavior是战斗武器接口,KnifeBehavior和GanBehavior分别是使用剑、枪作为武器。

在这里插入图片描述
* Character超类

/**
 * @Auther: ARong
 * @Date: 2018/11/17 16:35
 * @Description: 角色超类,定义了角色的名字和武器使用方式以及战斗行为
 */
public abstract class Character {
    //角色名字
    private String name;

    //武器使用方式
    private WeaponBehavior weaponBehavior;

    //战斗行为
    private FightBehavior fightBehavior;

 

    //构造方法
    public Character(String name) {
        this.name = name;
    }

    public Character() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public WeaponBehavior getWeaponBehavior() {
        return weaponBehavior;
    }

    public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
        this.weaponBehavior = weaponBehavior;
    }

    public FightBehavior getFightBehavior() {
        return fightBehavior;
    }

    public void setFightBehavior(FightBehavior fightBehavior) {
        this.fightBehavior = fightBehavior;
    }
}
  • WeaponBehavior接口
/**
 * @Auther: ARong
 * @Date: 2018/11/17 16:37
 * @Description: 定义了角色的武器使用方式
 */
public interface WeaponBehavior {
    public void userWeapon();
}
  • FightBehavior接口
/**
 * @Auther: ARong
 * @Date: 2018/11/17 16:38
 * @Description: 定义了角色的战斗行为
 */
public interface FightBehavior {
    public void fight();
}
  • KnifeBehavior实现类
/**
 * @Auther: ARong
 * @Date: 2018/11/17 16:42
 * @Description: WeaponBehavior的实现类,使用剑作为武器
 */
public class KnifeBehavior implements WeaponBehavior{

    @Override
    public void userWeapon() {
        System.out.println("使用剑战斗");
    }
}
  • GanBehavior实现类
/**
 * @Auther: ARong
 * @Date: 2018/11/17 16:43
 * @Description: WeaponBehavior的实现类,使用枪作为武器
 */
public class GanBehavior implements WeaponBehavior{

    @Override
    public void userWeapon() {
        System.out.println("使用枪战斗");
    }
}
  • Quene实现类
/**
 * @Auther: ARong
 * @Date: 2018/11/17 16:40
 * @Description: FightBehavior的实现类,使用队列战斗行为
 */
public class Quene implements FightBehavior{

    @Override
    public void fight() {
        System.out.println("队列战斗");
    }
}
  • Random实现类
/**
 * @Auther: ARong
 * @Date: 2018/11/17 16:42
 * @Description: FightBehavior的实现类,使用随机战斗行为
 */
public class Random implements FightBehavior{
    @Override
    public void fight() {
        System.out.println("随机战斗");
    }
}
  • GanFighter角色类
/**
 * @Auther: ARong
 * @Date: 2018/11/17 17:01
 * @Description: GanFighter是一个使用枪和随机战斗方式的角色
 */
public class GanFighter extends Character{

    //构造方法
    public GanFighter(String name){
        super.setName(name);
        super.setWeaponBehavior(new GanBehavior());
        super.setFightBehavior(new Random());
    }

    public GanFighter(){

    }


    //使用武器
    public void performWeapon(){
        super.getWeaponBehavior().userWeapon();
    }

    //战斗方式
    public void performFight(){
        super.getFightBehavior().fight();
    }

}

GanFight是一个使用枪和随机战斗方式的角色,所以在它的构造方法中,为它的战斗武器和方式接口创建了具体的实现类,使他拥有了以枪为武器和随机战斗的方式。

使用GanFighter类:

@Test
    public void userGanFighter(){
        GanFighter g_fighter = new GanFighter("G_Fighter");

        System.out.println(g_fighter.getName());
        g_fighter.performWeapon();
        g_fighter.performFight();
    }

在这里插入图片描述

如果你想让角色能更加地方便创建和使用,可以在使用方法时传递接口实现类的方式,从而达到要求:

/**
 * @Auther: ARong
 * @Date: 2018/11/17 16:44
 * @Description: Fighter类是Character的子类,并且在构造方法中需要实例化WeaponBehavior接口和FightBehavior接口的子类
 */
public class Fighter extends Character{
    //构造方法
    public Fighter(String n){
        //在实例化Fighter时指定Fighter的名字
        super.setName(n);
    }

    public Fighter(){

    }

    //战斗武器
    public void performWeapon(WeaponBehavior w){
        super.setWeaponBehavior(w);
        super.getWeaponBehavior().userWeapon();
    }

    //战斗方式
    public void performFight(FightBehavior f){
        super.setFightBehavior(f);
        super.getFightBehavior().fight();
    }

}

使用Fighter类去创建一个使用剑和随机战斗方式的角色:

@Test
    public void userFighter(){

       Fighter ganFighter = new Fighter("剑神");

        System.out.println(ganFighter.getName());
        //使用剑
        ganFighter.performWeapon(new KnifeBehavior());
        //随机战斗方式
        ganFighter.performFight(new Random());
    }

运行结果:
在这里插入图片描述

NX二次开发常用函数——从一个坐标系到另一个坐标系的转换(UF_MTX4_csys_to_csys )相同体坐标转化 本文介绍了在项目开发中实现坐标转换的方法,重点解析了两个关键函数UF_MTX4_csys_to_csys和UF_MTX4_vec3_multiply的使用。通过4个变换矩阵(transform1-4)实现工作坐标系与绝对坐标系之间的相互转换,并以圆柱体为例详细说明了坐标转换的具体实现过程,包括原点、X/Y轴方向的转换处理。相比之前采用的if-else判断方法,这种矩阵转换方式在代码复杂度和运行效率上都更具优势。 阅读详情

相关推荐

机器学习预测土壤养分:从电导率、pH到随机森林与神经网络的农业实践

在智慧农业与精准农业领域,机器学习已成为处理复杂农业数据、挖掘潜在规律的关键技术。其核心原理在于通过算法从多维数据中自动学习特征与目标变量之间的映射关系,尤其擅长捕捉非线性关联。这项技术的核心价值在于能够将传统上依赖昂贵、耗时实验室分析的问题(如土壤养分检测),转化为基于易获取传感器数据(如电导率、pH值)的快速、低成本预测任务,为农业生产的实时决策与资源优化提供了全新可能。其典型应用场景包括作物生长监测、产量预测以及精准施肥管理等。本文聚焦于利用随机森林和神经网络等回归算法,构建通过土壤物理参数预测氮磷钾

weixin_33693070的博客 669

设计模式初学者教程(上)

Good cooking takes time. If you are made to wait, it is to serve you better, and to please you. 美酒的酿造需要年头,美食的烹调需要时间;片刻等待,更多美味,更多享受。—— 《人月神话》 写在前面 前段时间,部门要求对新人进行设计模式方面的培训,因此就有了本文的雏形。当时由于时间原因...

grunt1223的专栏 374

华硕ROG枪神双系统实战:Ubuntu安装避坑指南

本文是华硕ROG枪神笔记本安装Ubuntu双系统的详细避坑指南。针对其独特的硬件与BIOS设计,文章核心解决了VMD控制器导致硬盘无法识别、驱动兼容性等关键难题,并提供了从BIOS设置、分区方案到安装后驱动配置与性能调优的一站式解决方案,帮助用户实现稳定的双系统体验。

raspberrypi5的博客 546

java设计模式之策略模式

策略模式 模拟鸭子游戏SimUDuck 设计原则:找出应用中需要变化之处,把它们独立出来,不需要和那些变化的代码混在一起 设计原则:针对接口编程,而不是针对实现编程 设计原则:多用组合,少用继承 策略模式定义:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户 1 public class MiniDuckSi...

aihua5318的博客 161

5-DOF机械臂课程设计(一)之正逆运动学

文章目录基本要求基本概念关节坐标系的建立正运动学求解DH参数表的建立逆运动学求解多解下解的选取源码下载后续 基本要求 ​ 开发上位机程序,要求有良好的界面,能提供关节空间下和笛卡尔坐 标下表示的目标位姿点和中间若干经过点的输入功能,进行轨迹规划, 并控制机械臂沿轨迹运动,最终完成目标抓取的任务。 基本概念 连杆长度 :2个相邻关节轴线之间的距离 连杆扭角 :2个相邻关节轴线之间的角度 连杆偏距 :2个关节坐标系的X轴之间的距离 关节角度 :关节变量 计算时需要加初始角度偏移 关节坐标系的建立 ​ 根据《机

Rosen的博客 5859

RV1126 MIPI CSI-2驱动RGB888图像采集的V4L2实战解析

本文详细解析了在RV1126平台上通过MIPI CSI-2接口采集RGB888格式图像的完整V4L2实战流程。核心内容包括设备树(DTS)配置、内核驱动适配、Media Controller链路调试,以及使用v4l2-ctl工具进行图像抓取与验证的方法,旨在帮助开发者打通从硬件连接到稳定采集RGB888图像数据的关键环节。

weixin_29161719的博客 166

策略模式,看一篇就够了

在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变 context 对象的执行算法。...

weixin_45866849的博客 9446

LabVIEW工程密码保护机制与移除技术详解

LabVIEW作为工业自动化领域广泛使用的图形化编程工具,其密码保护机制涉及文件加密与权限控制等核心技术。从技术实现来看,现代版本采用AES-128加密结合SHA-256哈希校验,而经典版本使用XOR加密配合Base64编码。理解这些加密原理对于工程维护、灾难恢复等合法场景至关重要。在实际应用中,密码移除工具需要处理不同版本的文件结构差异,包括解析XML描述区的Protection标签、动态识别版本并应用对应解密策略。这类技术在工业设备维护、教学研究等场景具有重要价值,但必须注意遵守法律边界,确保拥有合法的

weixin_34161083的博客 392

策略模式 (Strategy Pattern)

策略模式 (Strategy Pattern)

sanmansan的博客 5276

在Ansys Mechanical中对磨损进行建模

在有限元分析中,磨损是通过移动接触表面上的节点来复制材料侵蚀来建模的。仿真迭代更新几何,并在每次更新后重新计算平衡,使过程成为非线性的。Ansys使用将压力、相对运动和材料阻力与表面损失联系起来的经验定律来处理连续介质尺度的磨损。要在Ansys Mechanical中激活磨损建模,必须使用TB,WEAR命令定义专用材料模型。该命令与 TBDATA 相结合,允许用户输入与磨损相关的材料常数,以控制磨损的计算方式以及在接触表面上的应用方式。

jkh920184196的博客 2631

Centos7.6下安装Zabbix6

一、

Overmaster博客 1906

设计模式-策略模式

策略模式(strategy pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。

鱼粉大王 8521

华为Ascend C算子开发能力认证(中级)(个人记录,有完整代码,已通过认证,仅供参考)

本文介绍了在昇腾NPU环境下实现Sigmoid算子的完整流程。首先需要在华为云ModelArts-Notebook或开发者套件上搭建环境,要求CANN版本为8.0.0.beta1。主要内容包括:1)实现SigmoidCustom算子的kernel侧核函数代码;2)完成host侧Tiling结构体实现;3)支持Float16数据类型。代码实现部分详细展示了核函数计算流程、数据拷贝和牛顿迭代优化方法。最后介绍了编译部署流程,包括环境配置、代码上传、编译执行等步骤,并提供了提交规范说明。该实现通过调用Ascend

qq_73044452的博客 1109

设计模式1 - 策略模式【Strategy Pattern】

策略模式 定义: 指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 例子(锦囊妙计): Code: 定义接口: /** * 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口 */ public interface IStrategy { //每个锦囊妙计都是一个可执行的算法 p...

阿甘兄 1072

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

设计模式笔记1:策略模式(Strategy pattern)

一、策略模式内容 策略模式定义了算法簇,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车(Shopping Cat)系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的教材类图书实行每本一元的折扣;对连环画类图书提供每本7%的促销折扣,而对非教材类的计算...

java开发指南博客 【转载】 162

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

设计模式1 策略模式

定义 策略模式(Strategy Pattern)定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. AKA:政策模式(Policy Pattern) 使用

mxb1234567的博客 204

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

设计模式之1——策略模式

生活案例         跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,关键是追MM锦囊中有好多Strategy哦。 计算机中的动机         而软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。

张连海 1988

【Java设计模式】1.策略模式

【java设计模式】1.策略模式写在文章的最前面什么是设计模式?问题的引出功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导...

qq_37344025的博客 799

PHP设计模式之策略模式1

策略模式,又称为政策模式,属于行为型的设计模式。 Gof类图及解释 GoF定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可独立于使用它的客户而变化 。 GoF类图 代码实现 interface Strategy{ function AlgorithmInterface(); } class ConcreteStrategyA impl...

bujidexinq的专栏 168

设计模式1-策略模式

C++ 模拟鸭子类并展示如何使用继承和多态,同时如何抽离行为和扩展行为。有两个设计原则,并使用了策略模式。

weixin_44200074的博客 423

设计模式1(策略模式)

设计模式的三个原则 不变的和变化的分开。 针对接口编程,而不针对实现编程。 多考虑组合,而不是继承。 策略模式 定义算法族,分别封装,使之可以相互替换,此模式让算法的变化独立于使用算法的客户。 ...

qq_39734254的博客 186

设计模式1——策略模式

设计模式 策略模式 Define a family of algorithms,encapsulate each one,and make them interchangeable. 定义一系列的算法,把它们封装起来,并且使它们可以相互替换。 Strategy lets the algorithm vary independently from clients that use

gythlover的专栏 330

设计模式(1)策略模式

策略模式 文章目录策略模式概念介绍实现 概念 策略设计模式就是定义算法簇并封装起来,上他们之间可以互相代替,此模式让算法的变化独立于使用算法的客户。 介绍 意图 :定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。 如何解决:将...

lw的博客 351

设计模式 - D1 - 策略模式

设计模式 - D1 - 策略模式策略模式示例开发阶段:父类Duck及其子类维护阶段:新增Fly方法使用接口改进使用策略模式改进 策略模式 策略模式定义了算法族并分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户。 该模式体现了七大设计原则中的合成复用原则:多用组合/聚合,少用继承, 从而令系统具有更大的弹性。 示例 开发阶段:父类Duck及其子类 假设有一个父类Duck,里面定义了各种鸭子的行为,包括quack(呱呱叫)、swim(游泳)、display(外观),同时有子类Mal

LeonAPASS的博客 163

1、设计模式之策略模式

设计模式的一句话 :过分设计是一种罪过,要根据项目实事求是,没有任何一种设计是一步到位,很多功能都是根据反馈进行改善。1、背景:在实际开发中,我们常常遇见实现某种业务功能时,有许多不同实现方式,使用者可以任意选择其中的一种方式。 例如,在排序某个序列数据时,我们可以选择冒泡排序、快速排序、插入排序、堆排序等等。我们在开发过程中,通常会选择 将不同的算法以硬编码的方式封装到一个类当中,当我们需要添

桂学成 - just do it 1356

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

为什么要学设计模式? 因为设计模式是面向对象的具体实现,你将学习其他开发人员的经验,解决在特定场景下的问题,设计模式在开发过程中随处可见,它真的很重要!!! 开始学习策略模式… 1.1 引言 在开发过程中,当遇到如下场景: 一款游戏,不同的鸭子具有不同的飞行行为,例如,一般的鸭子具有飞行的行为,橡皮鸭和模型鸭不具有飞行的行为。 购物时,不同会员等级对应的商品价格折扣是不同的,折扣具有不同的算法,例如,金牌会员打7折,银牌会员打8折; 就上述场景而言,针对某一问题,具有不同的应对策略(行为或算法等,统称策

qq_36188127的博客 346
上一篇: Golang(8)-goquery库的使用
下一篇: 设计模式(2)-观察者模式
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值