设计模式之策略模式详解

目录

什么是策略模式

应用场景

业务场景实现

抽象类

实现类

Context上下文

测试类

策略模式的优缺点


什么是策略模式

他将定义的算法家族、分别封装起来,让他们之间可以相互替换,从而让算法的变化不会影响到使用算法的用户。

策略模式使用的就是面向对象的继承和多态机制,从而实现同一行为在不同场景下具备不同实现。

应用场景


策略模式在生活中应用很多。比如一个人的胶水比例与他的工资有关,不同的工资水平对应不同的税率;再比如我们在下单前需要选择支付方式,或者是商店折扣、比如支付宝、微信等。

策略模式可以解决在多种算法相似的情况下,避免使用if.else或switch…case带来的复杂性和臃肿性。在日常业务开发中,策略模式适用于以下场景:


首先看下策略模式的通用UML类图:

从类图中,我们可以看到,策略模式主要包含三种角色:

上下文角色(Context)

用来操作策略的上下文环境,屏蔽高层模块(客户端)对策略,算法的直接访问,封装可能存在的变化。

抽象策略角色(Strategy)

规定策略或算法的行为

具体策略角色(Concrete Strategy)

具体的策略或算法实现

业务场景实现

抽象类

/*** 策略类,定义所有支持的算法公共接口*/
/*** 抽象算法类*/
public abstract class strategy {//算法方法public abstract void algorithmInterface();}

实现类

public class ConcreteStrategyA extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法A实现");}
}
public class ConcreteStrategyB extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法B实现" );}
}
public class ConcreteStrategyC extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法C实现");}
}

Context上下文

/*** 上下文,维护对象的引用*/
public class content {strategy strategy;public content(策略模式.strategy strategy) {this.strategy = strategy;}public void  contentInterface(){//根据具体的策略对象,调用琦算法的方法strategy.algorithmInterface();}
}

测试类

public class main {public static void main(String[] args) {content content1;content1 = new content(new ConcreteStrategyA());content1.contentInterface();content1 = new content(new ConcreteStrategyB());content1.contentInterface();content1 = new content(new ConcreteStrategyC());content1.contentInterface();}
}

策略模式的优缺点

优点

  • 策略模式符合开闭原则
  • 避免使用多重条件转移语句,如if…else和switch这种。
  • 使用策略模式可以提高算法的保密性和安全性

缺点

  • 客户端需要知道所有的策略,并且自行决定使用哪一个策略类
  • 代码中会产生非常多的策略类,造成代码的臃肿,怎加维护难度。

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

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

相关文章

idea出现莫名其妙错的时候

正常情况idea使用起来都很顺手,但是当项目比较多的时候,可能出现莫名奇妙的错误,比如导入的包始终报错java: 程序包com不存在,或者引入自己写的包也不存在,或者始终出现红线但是排查之后没有问题的情况,这种…

进来吧,给自己10分钟,这篇文章带你直接学会python

Python的语言特性 Python是一门具有强类型(即变量类型是强制要求的)、动态性、隐式类型(不需要做变量声明)、大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言。 获取帮助 你可以很容易的通过Python解释器获取帮助。如果你想知道一个对象(o…

OJ:链表的中间结点

876. 链表的中间结点 - 力扣(LeetCode) 思路 思路:首先最容易想到的思路是什么呢,就是先遍历一遍链表,用一个值count来记录链表的长度,然后我们运用除法,/2,结果是几,就…

【C++干货基地】揭秘C++11常用特性:内联函数 | 范围for | auto自动识别 | nullptr指针空值

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

平台工程: 用Backstage构建开发者门户 - 2

本文介绍了如何使用开源Backstage构建自己的开发者门户,并基于此实践平台工程。本系列共两篇文章,这是第二篇。原文: Platform Engineering: Building Your Developer Portal with Backstage — Part 2 在本教程第一部分中我们了解了Backstage这个用于构…

外贸网站模板建站

测绘检测wordpress外贸主题 简洁实用的wordpress外贸主题,适合做测绘检测仪器设备的外贸公司使用。 https://www.jianzhanpress.com/?p5337 白马非马衣服WordPress外贸建站模板 白马非马服装行业wordpress外贸建站模板,适用于时间服装企业的官方网站…

Git 如何上传本地的所有分支

Git 如何上传本地的所有分支 比如一个本地 git 仓库里定义了两个远程分支,一个名为 origin, 一个名为 web 现在本地有一些分支是 web 远程仓库没有的分支,如何将本地所有分支都推送到 web 这个远程仓库上呢 git push web --all

pytorch loss函数整理

变量名解释 logits:未经过normalize(未经过激活函数处理)的原始分数,例如一个mlp将特征映射到num_target_class维的输出tensor就是logits。 probs:probabilities的简写,logits经过sigmoid函数,…

Doris实战——银联商务实时数仓构建

目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…

Jenkins的Pipeline概念

文章目录 Pipeline什么是Jenkins Pipeline声明式和脚本式Pipeline语法为何使用PipelinePipeline概念PipelineNodeStageStep Pipeline语法概述声明式Pipeline脚本式Pipeline Pipeline示例 参考 Pipeline 什么是Jenkins Pipeline Jenkins Pipeline是一套插件,它支持…

【Django】model模型—模型继承

Django中三种继承风格 抽象基类:仅将父类用于子类公共信息的载体,这样的父类永远都不会单独使用。多表继承:继承了一个模型(可能来源其它应用),且想要每个模型都有对应的数据表。代理模型:只想…

JProfiler相关问题及答案(2024)

1、JProfiler是什么及其用途 JProfiler是一款功能丰富的商业Java性能剖析(profiling)工具,它主要面向开发者和性能分析师,用于监测和分析Java应用程序的运行时行为。以下是对JProfiler的一些详细介绍和它的主要用途: …

webpack的一些知识

核心 webpack 是用来搭建前端工程的它运行在node环境中,它所做的事情,简单来说,就是打包具体来说,就是以某个模块作为入口,根据入口分析出所有模块的依赖关系,然后对各种模块进行合并、压缩,形…

洛谷P1157 组合的输出

深搜板子加一点点修改&#xff0c;适合初学者体会深搜&#xff0c;具体看代码 题目链接 ACcode #include<bits/stdc.h>using namespace std;int a, b;bitset<50>vis;//剪枝 int d[50];void dfs(int x) {if (x b 1) {for (int i 1;i < b;i)cout << se…

HBM(High Bandwidth Memory)

选择正确的高带宽内存 构建高性能芯片的选择越来越多&#xff0c;但附加内存的选择却几乎没有变化。为了在汽车、消费和超大规模计算中实现最大性能&#xff0c;选择取决于一种或多种 DRAM&#xff0c;而最大的权衡是成本与速度。 尽管多年来人们一直在努力用更快、更便宜或更…

Linux:kubernetes(k8s)搭建mater节点(kubeadm,kubectl,kubelet)(2)

安装k8有多种方式如&#xff1a; minikube kubeadm 二进制安装 命令行工具 我这里就使用kubeadm进行安装 环境 3台centos7 master ip &#xff1a;192.168.113.120 2G运存 2内核 node1 ip &#xff1a;192.168.113.121 2G运存 2内核 node2 ip &#xff1a;192.168.1…

重构与设计模型的完美融合:构建稳定可扩展系统的关键步骤

在软件开发的漫长旅程中&#xff0c;系统的稳定性和可扩展性一直是开发者们追求的目标。为了实现这一目标&#xff0c;重构和设计模型成为了不可或缺的两个关键元素。本文将探讨如何通过重构&#xff0c;使系统更稳定、更具可扩展性&#xff0c;并深入研究如何将重构与设计模型…

JavaEE:多线程(3):案例代码

目录 案例一&#xff1a;单例模式 饿汉模式 懒汉模式 思考&#xff1a;懒汉模式是否线程安全&#xff1f; 案例二&#xff1a;阻塞队列 可以实现生产者消费者模型 削峰填谷 接下来我们自己实现一个阻塞队列 1.先实现一个循环队列 2. 引入锁&#xff0c;实现线程安全 …

运用qsort函数进行快排并使用C语言模拟qsort

qsort 函数的使用 首先qsort函数是使用快速排序算法来进行排序的&#xff0c;下面我们打开官网来查看qsort是如何使用的。 这里有四个参数&#xff0c;首先base 是至待排序的数组的首元素的地址&#xff0c;num 是值这个数组的元素个数&#xff0c;size 是指每个元素的大小&am…

Python猜数字小游戏

下面这段代码是一个简单的数字猜测游戏&#xff0c;其中计算机已经提前计算出了414 // 23的结果并存储在变量num中。然后&#xff0c;程序会提示用户来猜测这个结果。 以下是代码的主要步骤和功能&#xff1a; 初始化&#xff1a; num 414 // 23&#xff1a;计算414除以23的整…