当前位置: 首页 > news >正文

设计模式之策略模式讲解

概念:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响客户端的情况下发生变化。

  • 抽象策略:对策略进行抽象,定义策略或算法的操作。
  • 具体策略:实现抽象策略中的操作,完成策略的具体实现。
  • 操作上下文角色:承上启下,集中处理策略的调用。

下面以一个购物的例子,根据不同用户身份,给与用于不同折扣,来帮助大家理解这个模式。

public interface DiscountStrategy {double calculateDiscount(double originalPrice);
}public class NormalUserDiscount implements DiscountStrategy {@Overridepublic double calculateDiscount(double originalPrice) {return originalPrice * 0.95; // 给普通用户提供5%的折扣}
}public class VipUserDiscount implements DiscountStrategy {@Overridepublic double calculateDiscount(double originalPrice) {return originalPrice * 0.9; // 给VIP用户提供10%的折扣}
}public class PremiumVipUserDiscount implements DiscountStrategy {@Overridepublic double calculateDiscount(double originalPrice) {return originalPrice * 0.85; // 给高级VIP用户提供15%的折扣}
}public class ShoppingCart {private DiscountStrategy discountStrategy;public ShoppingCart(DiscountStrategy discountStrategy) {this.discountStrategy = discountStrategy;}public void setDiscountStrategy(DiscountStrategy discountStrategy) {this.discountStrategy = discountStrategy;}public double applyDiscount(double originalPrice) {return discountStrategy.calculateDiscount(originalPrice);}
}public class Demo {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart(new NormalUserDiscount());System.out.println("原价: ¥100.00");System.out.println("普通用户折扣价: ¥" + cart.applyDiscount(100));cart.setDiscountStrategy(new VipUserDiscount());System.out.println("VIP 折扣价: ¥" + cart.applyDiscount(100));cart.setDiscountStrategy(new PremiumVipUserDiscount());System.out.println("超级VIP 折扣价: ¥" + cart.applyDiscount(100));}
}

如果大家需要视频版本的讲解,欢迎大家关注我的B站:

【天哥不爱学习的个人空间-哔哩哔哩】 https://b23.tv/HxwqjXl

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 性能测试入门基本概念
  • 代码随想录算法训练营 DAY 27 | 39.组合总和 40.组合总和 II 131.分割回文串
  • 解决Django中的UnicodeDecodeError问题
  • 机器学习machine learning
  • python爬-------urllib代理和代理池(第十七天)
  • 专业140+总410+国防科技大学831信号与系统考研经验国防科大电子信息与通信,真题,大纲,参考书。
  • 电脑远程控制esp32上的LED
  • 设计模式之创建型模式
  • 不同的子序列-java
  • UE4_动画基础_角色的缩放
  • conda创建虚拟环境太慢,Collecting package metadata (current_repodata.json): failed
  • SQLite数据库的性能问题并不是单纯地由数据量的大小决定的,而是受到多种因素的综合影响。以下是一些可能导致SQLite性能问题的因素
  • MongoDB聚合运算符:$map
  • AJAX —— 学习(一)
  • Leetcode56_合并区间
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • ES6 ...操作符
  • ES6之路之模块详解
  • js 实现textarea输入字数提示
  • LintCode 31. partitionArray 数组划分
  • mysql常用命令汇总
  • Node项目之评分系统(二)- 数据库设计
  • React-redux的原理以及使用
  • 基于HAProxy的高性能缓存服务器nuster
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 扑朔迷离的属性和特性【彻底弄清】
  • 使用docker-compose进行多节点部署
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 学习HTTP相关知识笔记
  • 译有关态射的一切
  • ###项目技术发展史
  • #QT(QCharts绘制曲线)
  • (007)XHTML文档之标题——h1~h6
  • (02)vite环境变量配置
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)fock函数详解
  • (转)Linux下编译安装log4cxx
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 设置默认首页
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net和jar包windows服务部署
  • .NET简谈设计模式之(单件模式)
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • /*在DataTable中更新、删除数据*/
  • @JoinTable会自动删除关联表的数据