Java设计模式中策略模式

ops/2024/11/13 17:32:56/

策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。这种模式定义了一系列算法,并使这些算法可以相互替换,使得算法的变化独立于使用算法的客户。

以下是策略模式的一般结构:

  1. Context(上下文):负责维护一个对Strategy对象的引用,并且将客户请求委托给Strategy对象。

  2. Strategy(策略):定义所有支持的算法的公共接口。通常是一个接口或者抽象类。

  3. ConcreteStrategy(具体策略):实现了Strategy接口的具体算法实现。

下面是一个简单的Java示例,演示了如何使用策略模式

java">// 1. Strategy
interface PaymentStrategy {void pay(double amount);
}// 2. ConcreteStrategy
class CreditCardPayment implements PaymentStrategy {private String cardNumber;private String expirationDate;private String cvv;public CreditCardPayment(String cardNumber, String expirationDate, String cvv) {this.cardNumber = cardNumber;this.expirationDate = expirationDate;this.cvv = cvv;}@Overridepublic void pay(double amount) {System.out.println("Paid $" + amount + " using Credit Card");}
}class PayPalPayment implements PaymentStrategy {private String email;private String password;public PayPalPayment(String email, String password) {this.email = email;this.password = password;}@Overridepublic void pay(double amount) {System.out.println("Paid $" + amount + " using PayPal");}
}// 3. Context
class ShoppingCart {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void checkout(double amount) {paymentStrategy.pay(amount);}
}// 4. 使用示例
public class Main {public static void main(String[] args) {// 创建购物车对象ShoppingCart cart = new ShoppingCart();// 设置支付策略为信用卡cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012", "10/25", "123"));// 结账cart.checkout(100.0);// 设置支付策略为PayPalcart.setPaymentStrategy(new PayPalPayment("example@example.com", "password"));// 结账cart.checkout(200.0);}
}

在这个示例中,PaymentStrategy是策略接口,CreditCardPayment和PayPalPayment是具体策略。ShoppingCart是上下文,它持有一个对PaymentStrategy的引用,并在结账时调用支付方法。通过更改支付策略,我们可以在不修改ShoppingCart的情况下选择不同的支付方式。


http://www.ppmy.cn/ops/20681.html

相关文章

web容器传统架构模型

web容器是部署web网站的容器。一般有tomcat、Jetty等。 作用是对系统端口监听,接收http、https等网络请求,然后交由web程序处理得到响应信息进行返回。 一般默认监听一个80端口,特殊情况可以配置多个端口(一台服务器上面跑多个w…

【深度学习】Yolov8使用心得

兜兜转转,原本以为和yolov没啥关系了,但是新公司又回到了yolov侧。 yolov8 可以用pip的方式安装,以package的三方软件包形式,隐藏了很多细节。当然你也可以从git上把全套代码down下来。 1.分类模型 1.1 改错误 位置&#xff1a…

SOLIDWORKS Electrical 3D--精准的三维布线

相信很多工程师在实际生产的时候都会遇到线材长度不准确的问题,从而导致线材浪费甚至整根线材报废的问题,这基本都是由于人工测量长度所导致的,因此本次和大家简单介绍一下SOLIDWORKS Electrical 3D布线的功能,Electrical 3D布线能…

【热门话题】Chrome 插件研发详解:从入门到实践

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Chrome 插件研发详解:从入门到实践一、引言二、Chrome 插件基础概念…

论基于架构的软件设计方法及应用

框架 一、 摘要 2020年12月,我参加了某省政协委员履职系统的开发。该系统为政协机关人员管理委员信息以及委员完成各项履职提供了全方位的软件支撑。我在该项目重担任系统架构师一职,负责履职系统的架构设计。本文结合作者的实践,以委员履职系统为例,论述基于架构的软件开…

Leetcode 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits “23” 输出:[“a…

vue项目npm run build 打包之后如何在本地访问

vue项目npm run build 打包之后如何在本地访问 如果直接访问时,则会报错如下的信息: 报错码: Access to script at file:///D:/assets/index-DDVBfHVo.js from origin null has been blocked by CORS policy: Cross origin requests are on…

WebMvcConfigurer(一)介绍

一、简介 WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于j…