【设计模式 02】策略模式( Strategy)

策略模式

参考:

  • CSDN | 策略模式
  • 百家号 | 策略模式

如果某个系统需要不同的算法(如超市收银的优惠算法),那么可以把这些算法独立出来,使之之间可以相互替换,这种模式叫做策略模式,它同样具有三个角色:

  1. 环境角色:使用策略的类
  2. 抽象策略角色:策略共有的抽象类或接口
  3. 具体策略角色:具体的策略的实现

策略模式的优缺点

优点:

  1. 需要新的算法时,只需要拓展策略,而不需要修改原有代码,符合开闭原则。
  2. 避免出现过多判断分支,提高代码可读性。
  3. 算法间可方便的进行继承,替换。

缺点:

  1. 客户端必须熟悉所有算法,并自行决定使用哪个策略
  2. 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

适用场景

一个系统中有很多类,这些类之间只有行为表现不同时,可以使用策略模式,策略模式在实例化策略时可以配合使用简单工厂。

例:

比如一个收银系统,结算时有不同的优惠策略,如 九折, 五折,满100减10等,这些不同的优惠策略便是”具体策略角色“,而收银系统就是 ”环境角色“,还需要定义一个 ”抽象策略角色“:

package pers.junebao.strategy_mode.discount;// 抽象策略角色
public interface BaseDiscountStrategy {double preferentialAlgorithm(double money);
}
package pers.junebao.strategy_mode.discount;// 折扣优惠(具体策略角色)
public class Discount implements BaseDiscountStrategy {private double discount;public Discount(double discount) {// Discount(double discount) {if(discount > 1)discount = 1;else if(discount < 0)discount = 0.1;this.discount = discount;}@Overridepublic double preferentialAlgorithm(double money) {return money * this.discount;}
}
package pers.junebao.strategy_mode.discount;// 满减优惠(具体策略角色)
public class FullReduction implements BaseDiscountStrategy {private double discountPrice;  //优惠金额private double baseline;  // 满减条件FullReduction(double baseline, double price) {this.baseline = baseline;this.discountPrice = price;}@Overridepublic double preferentialAlgorithm(double money) {if(money >= this.baseline)money -= this.discountPrice;return money;}
}

这样,环境角色就可以自己决定使用哪种策略而不用修改代码了

package pers.junebao.strategy_mode;import pers.junebao.strategy_mode.discount.BaseDiscountStrategy;
import pers.junebao.strategy_mode.discount.Discount;public class CashRegisterSystem {public static void main(String[] args) {BaseDiscountStrategy ds = new Discount(0.9);double purchasingPrice = 1500;double amountsPayable = ds.preferentialAlgorithm(purchasingPrice);System.out.println(amountsPayable);}
}

对于这些具体策略,可以使用简单工厂,进一步屏蔽策略的具体细节

package pers.junebao.strategy_mode.discount;public class StrategyFactory {public static BaseDiscountStrategy getDiscountStrategy(String name) {BaseDiscountStrategy result = null;switch (name){case "九折":{result = new Discount(0.9);break;}case "五折": {result = new Discount(0.5);break;}case "满100减10": {result = new FullReduction(100, 10);break;}case "满1000减200": {result = new FullReduction(1000, 200);break;}default:result = new OriginalPrice();}return result;}
}
BaseDiscountStrategy ds = StrategyFactory.getDiscountStrategy("满1000减200");

GitHub | 完整代码

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

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

相关文章

PL/SQL复合变量

复合变量可以将不同数据类型的多个值存储在一个单元中。由于复合类型可以由用户自己根据需要定义其结构&#xff0c;所以复合数据类型也称为自定义数据类型。在PL/SQL中&#xff0c;使用%TYPE声明的变量类型与数据表中字段的数据类型相同&#xff0c;当数据表中字段数据类型修改…

Android中使用am命令实现在命令行启动程序详解

在Android中&#xff0c;除了从界面上启动程序之外&#xff0c;还可以从命令行启动程序&#xff0c;使用的是命令行工具am. 复制代码代码如下:usage: am [subcommand] [options] start an Activity: am start [-D] -D: enable debugging send a broadcast Intent: am br…

用Visual Studio 2019连接 WSL来编译调试C/C++项目

因为有作业要在Linux环境下写&#xff0c;用虚拟机直接卡成PPT&#xff0c;VS code又不会调试&#xff0c;就搞一下VS 2019吧。 环境 windows 10 WSL(Ubuntu 18.04.4) Visual Studio Community 2019 Linux 里要有C/C环境&#xff08;gcc等&#xff09;VS要有 适用于 Linux…

node.js Websocket消息推送---GoEasy

Goeasy, 它是一款第三方推送服务平台&#xff0c;使用它的API可以轻松搞定实时推送&#xff01;个人感觉goeasy推送更稳定&#xff0c;推送速度快&#xff0c;代码简单易懂上手快浏览器兼容性&#xff1a;GoEasy推送支持websocket 和polling两种连接方式&#xff0c;从而可以支…

git 移动分支指针_理解git 中的HEAD指针branch指针

HEAD指针使用git checkout 来移动HEAD指针&#xff0c;移动的对象可以是分支指针也可以是快照。HEAD指针可以指向快照也可以指向branch。当指向branch时提交后会和branch指针一起向后移动&#xff0c;当不指向branch提交时时则会在一个detached状态。分支(branch)指针使用git b…

应用程序域

好文链接 使用.NET建立的可执行程序 .exe&#xff0c;并没有直接承载到进程当中&#xff0c;而是承载到应用程序域&#xff08;AppDomain&#xff09;当中。应用程序域是.NET引入的一个新概念&#xff0c;它比进程所占用的资源要少&#xff0c;可以被看作是一个轻量级的进程。 …

【设计模式 03】装饰模式——俄罗斯套娃?

装饰模式(俄罗斯套娃&#xff1f;) 装饰模式&#xff1a;动态的给某些对象添加额外的功能 参考&#xff1a; 简书 | 装饰模式 博客园 | 简说设计模式——装饰模式 博客园 | 装饰器模式 Decorator 结构型 设计模式 (十) 什么是装饰模式 装饰模式也叫装饰器模式&#xff0c;p…

系统移植的四大步骤

最近在学习系统移植的相关知识&#xff0c;在学习和调试过程中&#xff0c;发现了很多问题&#xff0c;也解决了很多问题&#xff0c;但总是对于我们的开发结果有一种莫名其妙的感觉&#xff0c;纠其原因&#xff0c;主要对于我们的开发环境没有一个深刻的认识&#xff0c;有时…

bem什么意思_bem是什么意思_bem的翻译_音标_读音_用法_例句_爱词霸在线词典

全部Methods Three different concentrations of the n - butanol extract of MOH ( BEM ) : 0.038 g L ~ ( - 1 ), 0.11 g L ~ ( - 1 ) and 0.34 g L ~ ( - 1 ) were prepared.巴戟天醇提取物 ( BEM ) 配成含生药0.038gL~ ( -1)、0.11gL~ ( -1 ) 、 0.34gL~ ( -1 ) 三种浓度…

display:flex

flex&#xff1a;弹性布局 常用属性介绍&#xff1a; flex-direction: column &#xff08;设置主容器主轴方向&#xff09; flex-flow: row wrap &#xff08;第一个参数为flex-direction&#xff0c;第二个为flex-wrap&#xff09; align-items: flex-start &#xff08;设…

Linux(Ubuntu 19.10)下 Qt5 连接 MySQL(QMYSQL driver not loaded)

Linux&#xff08;Ubuntu 19.10&#xff09;下 Qt5 连接 MySQL 安装好 MySQL 和 Qt Qt 连接 MySQL 的代码 QSqlDatabase dQSqlDatabase::addDatabase("QMYSQL");//加载mysql驱动&#xff0c;这个字符串是固定的 d.setHostName("127.0.0.1"); d.setDatabas…

华为消息推送 有透传通道吗_求解在推送用透传消息-使用厂商通道(我用的是基座测试) 用手机测试出现了“clientId离线”问题...

// #ifdef APP-PLUS// uni.showModal({// title: 提示,// content: 您的用户在其它的app登录&#xff0c;如果有问题&#xff0c;请修改密码或重新登录&#xff01;,// cancelText:"修改密码",// confirmText:"好的",// success: function (res) {// if (r…

oneuijs/You-Dont-Need-jQuery

oneuijs/You-Dont-Need-jQuery https://github.com/oneuijs/You-Dont-Need-jQuery/blob/master/README.zh-CN.mdYou Dont Need jQuery 前端发展很快&#xff0c;现代浏览器原生 API 已经足够好用。我们并不需要为了操作 DOM、Event 等再学习一下 jQuery 的 API。同时由于 React…

Wpf 数据绑定简介、实例1

简介&#xff1a;1.WPF绑定使用的源属性必须是依赖项属性&#xff0c;这是因为依赖项属性具有内置的更改通知支持&#xff0c;元素绑定表达式使用了Xaml扩展标记&#xff0c; WPF绑定一个控件是使用Binding.ElementName, 绑定非控件对象时使用Source,RelativeSource,DataContex…

【设计模式 04】代理模式

代理模式 代理模式( Proxy)&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 参考&#xff1a;refactoringguru | proxy 什么是代理模式 有时候如果想要访问某个对象&#xff0c;但又没办法直接访问或不方便直接访问&#xff0c;可以使用代理模式&#xff0c;代理…

css 大于号 标签_CSS设计基础选择器篇

点击上方 Java项目学习 &#xff0c;选择 星标 公众号重磅资讯、干货&#xff0c;第一时间送达前言&#xff1a;如果将CSS样式应用于特定的网页对象上&#xff0c;需要先找到目标元素。在CSS样式中执行这一任务的部分被称为选择器。1 标签选择器优点&#xff1a;为页面中同类型…

CSDN博客投票活动开始了

自己坚持写博客&#xff0c;一方面是为了将自己对知识点的理解做一个总结&#xff0c;另一方面也是因为自己看到了很多无私奉献分享自己知识的小伙伴们&#xff0c;因此自己也想像他们那样尽自己微薄之力把自己对某一知识点的理解分享给大家&#xff0c;或许算不上什么特高级的…

crontab 提示 command not found 解决方案

crontab 提示 command not found 解决方案 今天遇见一个问题&#xff0c;crontab的定时任务会报错&#xff1a;java command not found&#xff0c;但是手动执行脚本一直能成功。 猜想是环境变量的问题。 在crontab里添加个打印环境变量的任务&#xff1a; * * * * * echo $PAT…

java中文乱码decode_Java中文乱码处理

java编码转换过程我们总是用一个java类文件和用户进行最直接的交互(输入、输出)&#xff0c;这些交互内容包含的文字可能会包含中文。无论这些java类是与数据库交互&#xff0c;还是与前端页面交互&#xff0c;他们的生命周期总是这样的&#xff1a;1、程序员在操作系统上通过编…

【设计模式 05】工厂方法模式

工厂方法模式 define an interface or abstract class for creating an object but let the subclasses decide which class to instantiate. 参考&#xff1a; refactoringguru | factory-methodjavatpoint | factory-method-design-pattern博客园| 工厂方法 简单工厂的问题 …