【设计模式】第23节:行为型模式之“策略模式”

一、简介

策略模式:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。

二、适用场景

  • 动态选择算法
  • 多种类似的行为

三、UML类图

请添加图片描述

四、案例

根据成年人、青年、小孩的不同计算不同的价格。

package mainimport "fmt"type PricingStrategy interface {CalculatePrice(price float64) float64
}type ChildrenPricingStrategy struct {
}func NewChildrenPricingStrategy() *ChildrenPricingStrategy {return &ChildrenPricingStrategy{}
}func (s *ChildrenPricingStrategy) CalculatePrice(price float64) float64 {return price * 0.5
}type AdultPricingStrategy struct {
}func NewAdultPricingStrategy() *AdultPricingStrategy {return &AdultPricingStrategy{}
}func (s *AdultPricingStrategy) CalculatePrice(price float64) float64 {return price
}type SeniorPricingStrategy struct {
}func NewSeniorPricingStrategy() *SeniorPricingStrategy {return &SeniorPricingStrategy{}
}func (s *SeniorPricingStrategy) CalculatePrice(price float64) float64 {return price * 0.8
}type PriceCalculator struct {Strategy PricingStrategy
}func NewPriceCalculator(strategy PricingStrategy) *PriceCalculator {return &PriceCalculator{Strategy: strategy}
}func (pc *PriceCalculator) Calculator(price float64) float64 {return pc.Strategy.CalculatePrice(price)
}func main() {calculator := NewPriceCalculator(NewChildrenPricingStrategy())fmt.Printf("Children price: %v\n", calculator.Calculator(100))calculator = NewPriceCalculator(NewAdultPricingStrategy())fmt.Printf("Adult price: %v\n", calculator.Calculator(100))calculator = NewPriceCalculator(NewSeniorPricingStrategy())fmt.Printf("Senior price: %v\n", calculator.Calculator(100))
}

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

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

相关文章

idea中启动多例项目配置

多实例启动 日常本地开发微服务项目时,博主想要验证一下网关的负载均衡以及感知服务上下线能力时,需要用到多实例启动。 那么什么是多实例启动嘞?简单说就是能在本地同时启动多个同一服务。打个比方项目中有一个 MobileApplication 服务&…

Redis 应用问题

1-缓存穿透 1.1-问题描述 Key 对应的数据在数据源并不存在,每次针对此 Key 的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。 比如:用一个不存在的用户ID 获取用户信息,不论缓存还是数据库都没有&…

项目实战之安装依赖npm install

文章目录 nvmdeasync包和node-gyp报错deasync包node-gyp报错 前言:有些人看着还活着其实已经凉了好一会儿了。 初拿到项目 初拿到项目肯定是先看配置 package.json的啦,看看都需要安装什么依赖,然后 npm install,OK结束 皆大欢喜。 ————…

第十五章 EM期望极大算法及其推广

文章目录 导读符号说明混合模型伯努利混合模型(三硬币模型)问题描述三硬币模型的EM算法1.初值2.E步3.M步初值影响p,q 含义 EM算法另外视角Q 函数BMM的EM算法目标函数LEM算法导出 高斯混合模型GMM的EM算法1. 明确隐变量, 初值2. E步,确定Q函数3. M步4. 停止条件 如何应用GMM在聚…

html获取网络数据,列表展示 一

html获取网络数据&#xff0c;列表展示 js遍历json数组中的json对象 image.png || - 判断数据是否为空&#xff0c;为空就显示 - <!DOCTYPE html> <html><head><meta charset"utf-8"><title>网页列表</title></head><b…

Vite 的基本原理,和 webpack 在开发阶段的比较

目录 1&#xff0c;webpack 的流程2&#xff0c;Vite 的流程简单编译 3&#xff0c;总结 主要对比开发阶段。 1&#xff0c;webpack 的流程 开发阶段大致流程&#xff1a;指定一个入口文件&#xff0c;对相关的模块&#xff08;js css img 等&#xff09;先进行打包&#xff0…

(五)库存超卖案例实战——使用zookeeper分布式锁解决“超卖”问题

前言 本节内容使用zookeeper实现分布式锁&#xff0c;完成并发访问“超卖”问题的解决。相对于redis分布式锁&#xff0c;zookeeper能够保证足够的安全性。关于zookeeper的安装内容这里不做介绍&#xff0c;开始本节内容之前先自行安装好zookeeper中间键服务。这里我们利用创建…

CIM与MES

CIM系统&#xff0c;全称计算机集成制造系统&#xff08;Computer-Integrated Manufacturing&#xff09;&#xff0c;是一种集成了计算机技术、网络通讯技术和软件系统的制造自动化框架。CIM的主要目标是整合制造过程中的所有活动&#xff0c;包括生产管理、设备管理和品质管理…

《巴渝小将》少儿电视综艺走进江小白金色黄庄拍摄圆满成功!

巴渝小将&#xff0c;乘风破浪&#xff01; 张扬巴渝魅力&#xff0c;展示少年风采&#xff0c;本期拍摄我们来到了位于江津的江小白金色黄庄。 江小白金色黄庄位于永兴镇黄庄村&#xff0c;是一座充满诗意又不乏童趣的农文旅综合体&#xff0c;基于当地良好的酿酒高粱产业基础…

SpringBoot系列之自定义Jackson对象映射器格式日期数据

开发环境 JDK 1.8SpringBoot2.2.1Maven 3.2Mysql5.7.36开发工具 IntelliJ IDEAsmartGit 背景 在我之前的博客中&#xff0c;有对Springboot2.0集成Mybatis Plus做了比较详细的描述&#xff0c;现在这篇博客介绍&#xff0c;基于开源的jackson api来自定义ObjectMapping&…

生产环境使用boost::fiber

简介 boost::fiber是一类用户级线程&#xff0c;也就是纤程。其提供的例子与实际生产环境相距较远&#xff0c;本文将对其进行一定的改造&#xff0c;将其能够投入到生产环境。 同时由于纤程是具有传染性的&#xff0c;使用纤程的代码里也全部要用纤程封装&#xff0c;本文将对…

DBeaver 23.2.3发布,带来多项增强和修复

数据库管理工具DBeaver最新版本23.2.3已经发布。这个版本带来了一系列的增强和修复&#xff0c;提升了用户的使用体验和工作效率。 以下是DBeaver 23.2.3版本的一些亮点功能&#xff1a; 数据编辑器方面的改进&#xff1a; Excel (XLSX) 导出现在支持列自动拟合&#xff0c;…

Perl爬虫程序

以下是一个使用Perl爬虫程序&#xff0c;用于爬取图像。每行代码的中文解释如下&#xff1a; #!/usr/bin/perl ​ use strict; use warnings; use Mojo::UserAgent; use JSON; ​ # 创建一个Mojo::UserAgent实例 my $ua Mojo::UserAgent->new; ​ # 使用获取代理 my $prox…

Centos7快速重置root密码

1、重新启动Centos7&#xff0c;5秒内按向下方向键&#xff0c;使其停留在开机界面&#xff0c;如下图。 2、按’e’键&#xff0c;进入如下界面&#xff0c;移动向下方向键至“linux16”开头的行。然后按向右的方向键移动,找到“ro”并将其修改为“rw init/sysroot/bin/bash…

竞赛选题 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

对象加锁原理

每个对象都有一个对象头&#xff0c;叫做mark word&#xff0c;以32位虚拟机为例&#xff0c;64为虚拟机的mark word是64位 64位虚拟机的markword占64位&#xff1a; 偏向锁&#xff1a; 当对象一个线程加锁以后&#xff0c;在这个对象的markword中记录这个线程的id&#xff0c…

【RGB-HMS:先验驱动:超分】

PRINET: A PRIOR DRIVEN SPECTRAL SUPER-RESOLUTION NETWORK &#xff08;PRINET&#xff1a;先验驱动的光谱超分辨网络&#xff09; 光谱超分辨率是指直接从RGB图像重建高光谱图像。近年来&#xff0c;卷积网络已经成功地用于这一任务。然而&#xff0c;很少有人考虑到高光谱…

nodelist 与 HTMLCollection 的区别

原地址 https://cloud.tencent.com/developer/article/2013289 节点与元素 根据 W3C 的 HTML DOM 标准&#xff0c;HTML 文档中的所有内容都是节点&#xff1a; 整个文档是一个文档节点每个 HTML 元素是元素节点HTML 元素内的文本是文本节点每个 HTML 属性是属性节点注释是注…

ES-初识ES

文章目录 介绍ElasticSearchElasticSearch的主要功能ElasticSearch的主要特性ElasticSearch的家族成员LogStashKibanaBeats ELK&#xff08;ElasticSearch LogStash Kibana&#xff09;的应用场景与数据库集成指标采集/日志分析 安装和配置ElasticSearch一、安装1、下载ES安装…

SOME/IP 协议介绍(一)

1. 引言和功能概述 本文档规定了可扩展面向服务基于IP的中间件&#xff08;SOME/IP&#xff09;——一种用于汽车/嵌入式RPC机制和底层序列化/传输格式的示例&#xff0c;作为由RTE调用的序列化器。 唯一有效的缩写是SOME/IP。其他缩写&#xff08;例如Some/IP&#xff09;是…