java23种设计模式(二十) -- 策略模式(行为设计模式)

23种设计模式的概念 用 OO 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。应用实例:电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。3、如果要绘制不同的颜色,如红色、绿色、蓝色的矩形、圆形、椭圆、正方形,我们需要根据实际需要对形状和颜色进行组合,那么颜色、形状就是抽象部分,组合后的就是实现部分。 阅读详情

策略模式

简介

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。

在这里插入图片描述

角色

  • 环境(Context)角色:持有一个Strategy的引用。

  • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  • 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

代码

项目结构

在这里插入图片描述

实例场景

假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。

根据描述,折扣是根据以下的几个算法中的一个进行的:

  • 算法一:对初级会员没有折扣。

  • 算法二:对中级会员提供10%的促销折扣。

  • 算法三:对高级会员提供20%的促销折扣。

使用策略模式来实现的结构图如下:
在这里插入图片描述
抽象折扣类

public interface MemberStrategy {
    /**
     * 计算图书的价格
     * @param booksPrice    图书的原价
     * @return    计算出打折后的价格
     */
    public double calcPrice(double booksPrice);
}

折扣类

/**
 * 初级会员折扣类
 */
public class PrimaryMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        
        System.out.println("对于初级会员的没有折扣");
        return booksPrice;
    }

}

/**
 * 中级会员折扣类
 */
public class IntermediateMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {

        System.out.println("对于中级会员的折扣为10%");
        return booksPrice * 0.9;
    }

}

/**
 * 高级会员折扣类
 */
public class AdvancedMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        
        System.out.println("对于高级会员的折扣为20%");
        return booksPrice * 0.8;
    }
}

价格类

public class Price {
    //持有一个具体的策略对象
    private MemberStrategy strategy;
    /**
     * 构造函数,传入一个具体的策略对象
     * @param strategy    具体的策略对象
     */
    public Price(MemberStrategy strategy){
        this.strategy = strategy;
    }

    /**
     * 计算图书的价格
     * @param booksPrice    图书的原价
     * @return    计算出打折后的价格
     */
    public double quote(double booksPrice){
        return this.strategy.calcPrice(booksPrice);
    }
}

测试类

public class ApiTest {

    @Test
    public void testCommand(){
        //选择并创建需要使用的策略对象
        MemberStrategy strategy = new AdvancedMemberStrategy();
        //创建环境
        Price price = new Price(strategy);
        //计算价格
        double quote = price.quote(300);
        System.out.println("图书的最终价格为:" + quote);
    }

}

在这里插入图片描述

优点

  1. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
  2. 使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

缺点

  1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
  2. 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
购物车系统——Java大作业.zip 单子、工厂、策略、组合、观察者模式 1. 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。对所有的教材类图书 实行每本一元的折扣;对连环画类图书提供每本7%的促销折扣;而对非教材类的计算机图书有3%的折扣;对其余书没有折扣。使用策略模式、工厂模式、单子模式进行设计,类图如下。 在设计模式一的作业基础上,设计一个贩卖各类书籍的电子商务网站的购物车系统。该系统包括的模块有: 立即下载

相关推荐

CVAT自动标注避坑指南:从nuctl安装到YOLOv5模型部署的完整流程

本文详细介绍了在CVAT中部署YOLOv5自动标注功能的完整流程与避坑指南。重点解决了从nuctl工具安装、项目创建时因网络问题导致的镜像拉取失败,到最终模型函数部署与CVAT集成的关键步骤。针对国内网络环境,提供了实用的镜像替换方案,帮助用户顺利完成基于CPU的自动化标注环境搭建。

pytorch8learner的博客 229

【设计模式】23种设计模式之策略模式

23种设计模式之策略模式

qq_44899155的博客 1060

VCS多lib编译实战:如何高效处理Verilog模块重命名与分开编译

本文深入探讨了在复杂SoC设计中,如何利用VCS工具实现多库编译,以高效处理Verilog模块重命名与分开编译的工程难题。通过解析synopsys_sim.setup配置、Config映射机制,并提供完整的自动化脚本实战指南,帮助工程师构建健壮、可维护的编译环境,从而显著提升大型项目的编译效率和代码管理灵活性。

weixin_29169505的博客 357

java设计模式 4 策略模式

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,(这个类其实就是策略) 从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备

liunianzml的博客 347

百度飞桨+文心大模型实战:生成式AI工程师认证备考全攻略(含真题解析)

本文详细解析百度飞桨与文心大模型结合的生成式AI工程师认证备考策略,涵盖认证体系、学习路径、核心技能突破及真题分析。帮助开发者掌握大模型原理、飞桨平台操作和文心大模型应用,高效通过工信部与百度联合认证考试。

loss4bartender的博客 681

Ubuntu新手必看:3种方法快速查看和编辑JSON文件(附jq安装指南)

本文为Ubuntu新手详细介绍了三种查看和编辑JSON文件的核心方法:命令行利器jq、灵活脚本Python以及直观的图形化编辑器(如VS Code)。文章重点解析了jq的安装与核心用法,并对比了各方案的优缺点,帮助用户根据快速查询、复杂处理或直观编辑等不同场景,选择最合适的工具,从而高效处理JSON数据。

weixin_29229989的博客 415

策略模式

https://www.runoob.com/design-pattern/strategy-pattern.html 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 策略接口 public interface Strategy { public int doOperation(int num1, int num2); } 策略实现类 public class OperationAdd implements Strategy{ @Override publi

zhanghe_zht的博客 167

PCB数据集

整理了一部分PCB数据集

m0_57996537的博客 3867

Java设计模式(学习笔记)--Strategy 模式

  优先考虑使用策略模式,而不是具体继承 (Rod)产生的原因: 属于对象的行为模式。处理多于一个算法时候,把算法和使用算法的客户端分开(把行为和环境分割开),从而方便的选择其中一个算法。设现在要设计一个贩卖各类书籍的电子商务网站的购物车(Shopping Cat)系统。一个最简单的情况就是把所有货品的单价

wy818的专栏 1562

PCL 点云圆柱形邻域搜索【2026最新版】

圆柱形邻域搜索是KD-tree算法在点云数据处理中的扩展应用,在一些特定场景应用中具有无与伦比的优势。博客长期更新,本文最近一次更新时间为:2026年5月4日。

点云侠的博客 3449

YOLOv13改进:原创自研 | 卷积魔改 | 一种新颖的风车形卷积(PConv)融合注意力机制,加强微弱小目标检测能力

风车形卷积(PConv)融合注意力机制进一步提升小目标检测能力

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1054

Java二十三种设计模式-策略模式(13/23)

策略模式是一种行为型设计模式,它允许在运行时选择算法的行为,将算法封装在独立的策略类中,从而让算法可以互相替换。清晰的合同:策略接口应该清晰地定义策略的合同,让实现者容易理解和实现。合理定义:确保策略接口的定义合理,既不要太宽泛也不要太狭窄。策略模式提供了一种灵活的方式来替换和扩展算法,使得系统更加灵活和可扩展。通过本文的深入分析,希望读者能够对策略模式有更全面的理解,并在实际开发中做出合理的设计选择。博主还写了其他Java设计模式关联文章,请各位大佬批评指正:(一)

小相探索IT世界 1967

使用亚组分析进行子组分析并可视化森林图 - R语言

通过亚组分析和森林图的结合,我们可以更好地理解不同子组之间的差异和效果大小。当然,在实际应用中,还需要考虑多种因素,如样本量、异质性等,以得到更准确的结果和结论。每个森林图中的水平线代表了每个子组的效应估计,线的长度表示了该效应估计的置信区间。假设我们有一个包含研究对象的数据框(data frame),其中包括了治疗组和对照组的结果数据,以及一些可能的影响因素作为调整变量。在本例中,我们将比较两种不同的治疗方法(A和B)对结果变量的影响,并调整了一个额外的变量。是结果变量和对照组变量的列名。

2301_79326857的博客 1234

设计模式(二十二)行为型:策略模式详解

策略模式(Strategy Pattern)是 GoF 23 种设计模式中最具实用性和广泛影响力的行为型模式之一,其核心价值在于定义一系列算法或行为,并将每个算法封装到独立的类中,使得它们可以相互替换,且算法的变化独立于使用它的客户端。

谦与谦寻的神隐 1661

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Devexpress16.2.6破解工具

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

Java真的不难(二十七)策略模式

小应学长带你学Java

小应学长的的博客 2655

Camera2Demo

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

Java中常用的设计模式

文章转载借鉴:http://blog.youkuaiyun.com/zhangerqing 一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块...

Superme 13万+

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

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

java学习视频 java常用23种设计模式

java学习视频主要详细讲解java常用23种设计模式,此套java教程为百度网盘下载! 我曾经花了1万多报过java培训班.可能太过愚钝,感觉白学了。这套java学习视频讲的很好,我培训过,虽说学的很差,但是耳濡目染也算有点基础,写作业的时候没什么思路,但是参考了别人的思路,自己也能写完,写完作业感觉很有成就感。祝大家学有所成!   java学习视频介绍   java常用23...

fengliaoai的博客 1万+

Java进阶 23种设计模式 详解+应用+实例代码

文章目录前言一、单例模式1.概念2.单例模式应用(1) 懒汉式 基础版(2) 懒汉式 双重校验锁版(3) 饿汉式 单例模式(4)登记式 单例模式 前言 Java的 23种设计模式 创建型模式,共五种(1-5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种(6-12):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种(13-23):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式

Jiang_bug的博客 1万+

关于Java中的23种设计模式简介(超详细)

23种设计模式 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基

liubs_的博客 3022

JAVA的23种设计模式详解

JAVA的23种设计模式详解 一.介绍 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 ...

Java学习笔记 963

二十三种设计模式解析

目录 一、设计模式的分类 二、设计模式的六大原则 总原则:开闭原则(Open Close Principle) 1、单一职责原则 2、里氏替换原则(Liskov Substitution Principle) 3、依赖倒转原则(Dependence Inversion Principle) 4、接口隔离原则(Interface Segregation Principle) 5、迪米...

特立独行的程序猿 6324

Java设计模式——23种模式

背景最近在整合Java设计模式,平常偶尔也遇到过,同事之间也讨论过这模式的特点,本次结合当前个人经验及网上各位大神的分享,然后得出比较通俗易懂,当然在现实的项目中,里面包含的一些设计模式是比这复杂,望读者见谅本人因时间不易及撰写博客不易。设计模式从不断重复的事件中发现和抽象出的规律,是解决问题形成的经验总结(个人阅读一些书记下的一句话)。设计模式可以使得代码可重复性、可靠性、易读易被他人理解;设计模

在此立一个IT职业上的flag:https://github.com/Zeb-D/my-review 1万+

Java 23种设计模式超全详解

Java 23种设计模式超全详解!用生活案例+代码示例通俗讲解单例、工厂、观察者等模式原理,附模式选择指南和关系图谱。小白也能秒懂的设计模式实战教程,提升代码复用性和扩展性!

3016

Java 23种设计模式

Java 设计模式(疯狂Java 联盟版) 1 目录 1. 设计模式..........................................................................................................................................3 1.1 创建型模式.............

Freda的专栏 1775

【软件工程】详解23种设计模式原理java实现

设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目的是实现代码的高内聚和低耦合。23中设计模式的关系定义一个用户创建对象的接口,但由子类决定实例化哪个类。提供一个创建相关或依赖接口的接口,而无需指定具体类。确保一个类只有一个实例,并提供对该例的全局访问点。将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

杰西笔记 1121

Java开发中的23种设计模式

Java设计模式 1.1 创建型模式 FactoryMethod ( 工厂方法 ) AbstractFactory ( 抽象工厂 ) Singleton ( 单态模式 ) Builder ( 建造者模式 ) Prototype ( 原型模式 )  -------------------晚上会整理发布

ViVi.Geek的分享 1240
上一篇: java23种设计模式(十九) -- 状态模式(行为设计模式)
下一篇: java23种设计模式(二十一) -- 模板模式(行为设计模式)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值