大话设计模式——18.策略模式(Strategy Pattern)

简介

是一系列算法的封装,即做的事情相同(方法名称相同)但是实现的方式不同,以相同方式调用所有的算法,减少算法与使用算法的耦合。直接调用方法。

UML图

在这里插入图片描述

应用场景
  • Java AWT中的LayoutManager(布局管理器)
  • 系统中存在多个类,它们的区别仅在于它们的行为
  • 不希望暴露复杂与算法有关的数据结构
  • Java中Comparator 接口常用的 compare()方法

示例

电商平台会经常进行商品优惠活动,对商品或订单价格进行改动

  1. 商品
public class Product {/*** 产品价格*/private double price;/*** 产品名称*/private String productName;public Product(double price, String productName) {this.price = price;this.productName = productName;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}
}
  1. 策略:活动优惠策略
public interface Strategy {/*** 计算商品价格** @param product* @return*/double computePrice(Product product);
}

没有活动:

public class NormalActivity implements Strategy {@Overridepublic double computePrice(Product product) {return product.getPrice();}
}

打折活动:

public class DiscountActivity implements Strategy {private double discount;public DiscountActivity(double discount) {this.discount = discount;}@Overridepublic double computePrice(Product product) {return product.getPrice() * discount;}
}

代金券活动:

public class VoucherActivity implements Strategy {/*** 代金券*/private double voucher;public VoucherActivity(double voucher) {this.voucher = voucher;}@Overridepublic double computePrice(Product product) {return product.getPrice() > voucher ? product.getPrice() - voucher : 0;}
}
  1. 活动上下文:选择适当的活动促销策略
public class PromotionContext {/*** 策略*/private Strategy strategy;public PromotionContext(Strategy strategy) {this.strategy = strategy;}public double executeStrategy(Product product) {return this.strategy.computePrice(product);}
}
  1. 运行
public class Main {public static void main(String[] args) {// 创建商品Product phone = new Product(1999, "手机");// 促销策略PromotionContext promotionContext;// 原价promotionContext = new PromotionContext(new NormalActivity());System.out.println("原价:" + promotionContext.executeStrategy(phone));// 8折优惠promotionContext = new PromotionContext(new DiscountActivity(0.8));System.out.println("优惠价格:" + promotionContext.executeStrategy(phone));// 2000代金券promotionContext = new PromotionContext(new VoucherActivity(2000));System.out.println("券后价格:" + promotionContext.executeStrategy(phone));}
}

在这里插入图片描述

总结

  • 优点:

    • 满足开闭原则,当增加具体策略时,不需要修改上下文代码
    • 避免使用过多的条件判断,过多的条件判断语句不利于系统可维护性,扩展性和灵活性
  • 缺点

    • 策略类可能过多可能导致膨胀,复用性较小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARCHE-2024第三届上海国际智慧档案展览会暨高峰论坛即将开幕

一、ARCHE-2024精彩即将开幕 为进一步推动档案行业新科技创新应用与档案信息化再上台阶,加强档案行业交流互动,强化档案行业创新意识,实现相互促进、共同发展,作为6.9国际档案日系列活动的重要延伸——“2024第三届上海国际智慧档…

(十三)强缓存和协商缓存的区别

一、浏览器的缓存策略 浏览器的缓存策略是指浏览器在加载页面时如何使用和管理缓存机制。可以提高网页加载速度,减轻服务器负载,并提供更好的用户体验。常用的缓存策略有两种:一种是发送请求(协商缓存),一…

echarts 如何设置(dataZoom)多个图形的数据区域一起联动缩放响应

数据区域联动缩放需要用到 dataZoom 的专属事件 dispatchAction 实现多个数据区域联动缩放功能 <div style"width:100%;height:320px;" id"test01"></div> <div style"width:100%;height:320px;" id"test02"></…

ssm 项目 连接 redis 报错 : 可能是 不加 密码就不报错了

ssm 项目 连接 redis 报错 &#xff1a; 可能是 不加 密码就不报错了**

MAC(M1芯片)编译Java项目慢且发热严重问题解决方案

目录 一、背景二、排查三、解决四、效果以及结果展示五、总结 一、背景 使用idea编译项目等操作&#xff0c;经常性发热严重&#xff0c;并且时间慢。直到昨天编译一个项目用时30分钟&#xff0c;电脑温度很高&#xff0c;并且有烧灼的味道&#xff0c;于是有了此篇文章。 二、…

C++(六个默认成员函数)

目录 六个默认成员函数构造函数析构函数拷贝构造函数 总结 六个默认成员函数 默认成员函数的概念&#xff1a;如果用户不显式写&#xff0c;编译器会自动生成的函数&#xff0c;就是默认成员函数 构造函数 构造函数是六个默认成员函数之一&#xff0c;构造函数的功能类似于init…

C#面:什么链式委托

链式委托是指将多个委托实例连接在一起&#xff0c;形成一个委托链&#xff0c;使得多个方法可以按照一定的顺序依次被调用。 在C#中&#xff0c;可以使用""运算符来连接多个委托实例&#xff0c;形成一个新的委托实例。 当调用链式委托时&#xff0c;每个委托实例都…

懒人必备!4个PS抠图技巧,让你轻松处理复杂背景!

今天带给大家的又是一个绝对重要的知识&#xff0c;那就是“抠图”&#xff01; 在我们的设计中&#xff0c;抠图可以说是最常见的运用啦&#xff0c;简单的PS抠图我们都会&#xff0c;但是最令我们头痛的人物或者动物的毛发的抠图了&#xff0c;很多人都抠不好&#xff0c;我…

合并单元格的excel文件转换成json数据格式

github地址: https://github.com/CodeWang-Ay/DataProcess 类型1 需求1: 类似于数据格式: https://blog.csdn.net/qq_44072222/article/details/120884158 目标json格式 {"位置": 1, "名称": "nba球员", "国家": "美国"…

华为机试题

目录 第一章、HJ1计算字符串最后一个单词的长度&#xff0c;单词以空格隔开。1.1&#xff09;描述1.2&#xff09;解题第二章、算法题HJ2 计算某字符出现次数1.1&#xff09;题目描述1.2&#xff09;解题思路与答案第三章、算法题HJ3 明明的随机数1.1&#xff09;题目描述1.2&a…

eBPF专题一 | 手把手教你用eBPF诊断MySQL(含源码)

DBdoctor 是一款数据库内核级性能诊断工具&#xff0c;利用eBPF技术深入数据库内核&#xff0c;致力于解决数据库的一切性能问题。 被称之为“革命性”内核技术的eBPF一直以来都备受关注&#xff0c;而DBdoctor作为一款数据库性能诊断工具&#xff0c;首次将eBPF技术深入应用…

centos 安装 stable-diffusion 详细流程

一、准备环境 安装git 新版 先安装git 工具来更新git源码 &#xff0c; 载下源码后卸载git 版本(centos 默认1.8版本&#xff0c;说是安装会引起失败) 安装git 命令&#xff0c;可使用 git --version查看版本 sudo yum install git -y 卸载git命令 sudo yum remove git 正式…

golang 中 sync包

WaitGroup WaitGroup 的用途&#xff1a;它能够一直等到所有的 goroutine 执行完成&#xff0c;并且阻塞主线程的执行&#xff0c;直到所有的 goroutine 执行完成。 WaitGroup 总共有三个方法&#xff1a;Add(delta int), Done(), Wait()。简单的说一下这三个方法的作用。 Add&…

FPGA实现Canny算法(Verilog)

在边缘检测算法里面Sobel是比较简单的一个算法&#xff0c;但是其检测出来的边缘往往是比较粗的&#xff0c;效果不是很好&#xff0c;因为我们最理想的边缘肯定就是一个宽度为1的细线。 Canny算法在此基础上进行了改进&#xff0c;通过使用边缘的梯度信息进行非最大值抑制(NM…

PCL 点到圆柱的距离(3D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里的思路也很简单,我们只需要将点转换到圆柱坐标系下,在该系统中,点(0,0,0)为圆柱轴原点,(0,0,1)为圆柱轴方向,那么此时计算点到圆柱的距离就简单很多了,我们可以利用正射投影快速的获得距离结果。 二、实现…

【随笔】Git 高级篇 -- 最近标签距离查询 git describe(二十一)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

【计算机毕业设计】企业仓储管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

5.消息队列

消息队列 ​ 消息队列是一种常用的线程间通讯方式&#xff0c;用来传输数据。使用消息队列传输数据时有两种方法&#xff1a;拷贝&#xff1a;把数据、把变量的值复制进消息队列里&#xff1b;引用&#xff1a;把数据、把变量的地址复制进消息队列里。rtt使用拷贝值的方法。 …

python-pytorch实现CBOW 0.5.000

python-pytorch实现CBOW 0.5.000 数据加载、切词准备训练数据准备模型和参数训练保存模型加载模型简单预测获取词向量降维显示图使用词向量计算相似度参考 数据加载、切词 按照链接https://blog.csdn.net/m0_60688978/article/details/137538274操作后&#xff0c;可以获得的数…

由近期 RAGFlow 的火爆看 RAG 的现状与未来

4 月 1 日&#xff0c;InfiniFlow &#xff08;英飞流&#xff09;的端到端 RAG 解决方案 RAGFlow 正式开源&#xff0c;首日即获得了 github 千星&#xff0c;目前已接近 3000 star。在这之前&#xff0c;InfiniFlow 还开源了专门用于 RAG 场景的 AI 原生数据库 Infinity&…