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

设计模式策略模式讲解和代码示例

引言

策略是一种行为设计模式, 它将一组行为转换为对象, 并使其在原始上下文对象内部能够相互替换。

原始对象被称为上下文, 它包含指向策略对象的引用并将执行行为的任务分派给策略对象。 为了改变上下文完成其工作的方式, 其他对象可以使用另一个对象来替换当前链接的策略对象。

Java语言

使用示例: 策略模式在 Java 代码中很常见。 它经常在各种框架中使用, 能在不扩展类的情况下向用户提供改变其行为的方式。

Java 8 开始支持 lambda 方法, 它可作为一种替代策略模式的简单方式。

这里有一些核心 Java 程序库中策略模式的示例:

  • 对java.util.Comparator#fcompare()的调用来自 Collections#sort()。
  • javax.servlet.http.HttpServlet: service()方法,还有所有接受 HttpServletRequest和 HttpservletResponse对象作为参数的 doxxX()方法。
  • javax.servlet.Filter#doFilter

识别方法: 策略模式可以通过允许嵌套对象完成实际工作的方法以及允许将该对象替换为不同对象的设置器来识别。

电子商务应用中的支付方法

在本例中, 策略模式被用于在电子商务应用中实现各种支付方法。 客户选中希望购买的商品后需要选择一种支付方式: Paypal 或者信用卡。

具体策略不仅会完成实际的支付工作, 还会改变支付表单的行为, 并在表单中提供相应的字段来记录支付信息。

strategies

 strategies/PayStrategy.java: 通用的支付方法接口
/*** Common interface for all strategies.*/
public interface PayStrategy {boolean pay(int paymentAmount);void collectPaymentDetails();
}
 strategies/PayByPayPal.java: 使用 PayPal 支付
/*** Concrete strategy. Implements PayPal payment method.*/
public class PayByPayPal implements PayStrategy {private static final Map<String, String> DATA_BASE = new HashMap<>();private final BufferedReader READER = new BufferedReader(new InputStreamReader(System.in));private String email;private String password;private boolean signedIn;static {DATA_BASE.put("amanda1985", "amanda@ya.com");DATA_BASE.put("qwerty", "john@amazon.eu");}/*** Collect customer's data.*/@Overridepublic void collectPaymentDetails() {try {while (!signedIn) {System.out.print("Enter the user's email: ");email = READER.readLine();System.out.print("Enter the password: ");password = READER.readLine();if (verify()) {System.out.println("Data verification has been successful.");} else {System.out.println("Wrong email or password!");}}} catch (IOException e
http://www.lryc.cn/news/262654.html

相关文章:

  • Qt容器QStackedWidget小部件堆栈
  • 设计模式 简单工厂 工厂方法模式 抽象工厂模式 Spring 工厂 BeanFactory 解析
  • 【Hive_03】单行函数、聚合函数、窗口函数、自定义函数、炸裂函数
  • RabbitMQ手动应答与持久化
  • java使用枚举类型解决if-else大量堆积
  • 【数据结构】八大排序之直接插入排序算法
  • 网络编程『socket套接字 ‖ 简易UDP网络程序』
  • FreeSWITCH rtp endpoint recvonly
  • Hadoop和Spark的区别
  • 英文论文降重修改技巧 papergpt
  • DevOps搭建(十)-安装Harbor镜像仓库详细步骤
  • DDA 算法
  • 天猫数据平台-淘宝天猫数据-天猫销售数据分析:11月天猫平台滑雪运动装备行业销量翻倍!
  • 使用OpenCV和PIL库读取图片的区别
  • Amazon CodeWhisperer:AI 编程助手
  • Linux 使用 Anaconda+Uwsgi 部署 Django项目和前端项目
  • 分析若依的文件上传处理逻辑
  • Note3---初阶二叉树~~
  • ElasticSearch学习篇8_Lucene之数据存储(Stored Field、DocValue、BKD Tree)
  • ROS机器人入门
  • 30. 深度学习进阶 - 池化
  • 工业应用新典范,飞凌嵌入式FET-D9360-C核心板发布!
  • Webrtc 学习交流
  • 华为云之轻松搭建 Nginx 静态网站
  • 【pytorch】图像运行过程中,保证梯度情况下变换
  • 学习Java第70天,过滤器Filter简介
  • Ubuntu Desktop 22.04 设置 ssh 超时时间
  • 【微服务】Spring Aop原理深入解析
  • Spring Boot JSON中文文档
  • Flink系列之:State Time-To-Live (TTL)