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

设计模式(七):策略模式(行为型模式)

FullDiscount 

Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,
并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。

场景:购物车结算时,根据不同的客户,计算不同的折扣策略,先定义个折扣策略基类Discount,各种不同的折扣定义子类来继承。根据实际的情况,再将折扣策略传给购物车对象进行订单的结算。

类图:

PatterTest类调用购物车ShoppingCart测试,ShoppingCart传入Discount来计算折扣。

Discount.java基类

package com.figo.study2024.pattern.strategy;/*** 计算折扣接口*/
public interface Discount {public int calculate(int money);
}
package com.figo.study2024.pattern.strategy;/*** 满减*/
public class FullDiscount implements Discount {@Overridepublic int calculate(int money) {if (money > 200){System.out.println("优惠减免20元");return money - 20;}return money;}
}
package com.figo.study2024.pattern.strategy;/*** 首次购*/
public class NewerDiscount implements Discount {@Overridepublic int calculate(int money) {if (money > 100){return money - 20;}return money;}
}
package com.figo.study2024.pattern.strategy;
/*** 测试策略模式* 购物车费用结算过程*/
public abstract class ShoppingCart {private Discount discount;public void setDiscount(Discount discount) {this.discount = discount;}//提交订单主流程public void submitOrder(){//计算商品金额int money = balance();System.out.println("商品总金额为:"+money+"元");//优惠减免money = discount.calculate(money);System.out.println("优惠减免后:"+ money+"元,");//保存及支付订单pay(money);//送货上门sendHome();}//计算金额private int balance(){int money = 280;//TODO 累加商品金额return money;}private void sendHome(){System.out.println("满39,免费送货上门");}//提交支付protected abstract void pay(int money);}

策略模式测试:

package com.figo.study2024.pattern.strategy;import com.figo.study2024.pattern.template.MilkTea;
import com.figo.study2024.pattern.template.PearlMilkTea;
import com.figo.study2024.pattern.template.RedBeanMilkTea;/*** @ClassName:PatterTest* @PackageName:com.figo.study2024.pattern.template* @Description:客户端调用类描述* @Date:2024/2/20 12:53* @Author:figo*/
public class PatterTest {public static void main(String[] args) {/*** 购物车这里可以使用模板方法设计模式,继承ShoppingCart* ,重写pay方法即可,这里演示策略模式就不另外写了*/ShoppingCart cart=new ShoppingCart() {@Overrideprotected void pay(int money) {System.out.println("使用云闪付支付");}};//新用户,可以查询用户是否有购买记录,没有的话使用新用户折扣策略cart.setDiscount(new NewerDiscount());//满减,有购买记录,检查是否符合满减策略
//        cart.setDiscount(new FullDiscount());cart.submitOrder();}
}

http://www.lryc.cn/news/303140.html

相关文章:

  • 人工智能|深度学习——基于对抗网络的室内定位系统
  • MySQL的配置文件my.cnf正常的配置项目
  • 小程序API能力集成指南——界面导航栏API汇总
  • onlyoffice基础环境搭建+部署+demo可直接运行 最简单的入门
  • ubuntu 22.04 图文安装
  • Dockerfile文件中只指定挂载点会发生什么?
  • 详解 leetcode_078. 合并K个升序链表.小顶堆实现
  • OpenHarmony下gn相关使用
  • 怎样重置ubuntu mysql8密码
  • SpringBoot+WebSocket实现即时通讯(三)
  • vue3前端项目开发,具备纯天然的防止爬虫采集的特征
  • js 多对象去重(多属性去重)
  • 在 JavaScript 中,Map 与 object 的差别?为什么有 object 还需要 Map?
  • 【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——自我介绍(英文)
  • ACP科普:IDEAL含义及应用
  • 【GO语言卵细胞级别教程】06.GO语言的字符串操作
  • 【笔记】【算法设计与分析 - 北航童咏昕教授】绪论
  • 大语言模型LLM中Transformer模型的调用过程与步骤
  • mysql connect unblock with mysqladmin flush-hosts
  • 每日一练:前端js实现算法之两数之和
  • 17.隐式参数的定义和使用
  • 简单介绍一下WebRTC中NACK机制
  • 05 Flink 的 WordCount
  • 2024云服务器ECS_云主机_服务器托管_e实例-阿里云
  • 掌握这8大工具,自媒体ai写作之路畅通无阻! #经验分享#科技#媒体
  • CTFHub技能树web之文件上传(一)
  • 蔚来面试解答
  • Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截
  • Java使用企业邮箱发送预警邮件
  • Unity编辑器扩展之是否勾选Text组件BestFit选项工具(此篇教程也可以操作其他组件的属性)