Java设计模式中策略模式

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

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

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

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

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

下面是一个简单的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.mzph.cn/news/828085.shtml

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

相关文章

bugku-杂项-社工进阶收集

下载附件 得到图片 利用百度地图查找 这里得到地点名称大雁塔音乐喷泉 陕西省西安市,大雁塔北广场 打开高德地图 来到大雁塔北广场 因为在北广场,所以地铁站为大雁塔站 开始分析 坐七站到大雁塔站,即始发站为韦曲南站 因为始发站离她家800米&…

高频前端面试题汇总之HTML篇

1. src和href的区别 src和href都是用来引用外部的资源,它们的区别如下: src: 表示对资源的引用,它指向的内容会嵌入到当前标签所在的位置。src会将其指向的资源下载并应⽤到⽂档内,如请求js脚本。当浏览器解析到该元素…

34. BI - 美国大学生足球队的 GCN 案例

本文为 「茶桁的 AI 秘籍 - BI 篇 第 34 篇」 文章目录 美国大学生足球队 Embedding(GCN) Hi,你好。我是茶桁。 在上一节课中,因为需要,我们先是回顾了一下 Graph Embedding,然后跟大家讲解了 GCN 以及其算…

linux驱动-CCF-0基础

1. 时钟设备 晶振:提供基础时钟源的(可分为有源晶振、无源晶振两种); PLL: 用于倍频的锁相环; mux: 用于多路时钟源选择; Divider: 用于分频的; gate: 用于时钟使能的与门电路等 2. CCF…

Python读写文本URL蓝牙WIFI自动连接电子名片位置坐标智能海报等NDEF标签

本示例使用的发卡器:https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.60ad789erlonvk 近场通信(Near Field Communication,简称NFC),是一种新兴的技术&…

技术速递|Java on Azure Tooling 3月更新 - Java on Azure 开发工具未来六个月路线图发布

作者:Jialuo Gan - Program Manager, Developer Division At Microsoft 排版:Alan Wang 大家好,欢迎阅读 Java on Azure 工具的三月更新。在本次更新中,我们将分享未来几个月对 Java on Azure 开发工具的投资。此外,我…

Redis入门到通关之数据结构解析-Dict

文章目录 概述构成Dict的扩容Dict的rehash总结 欢迎来到 请回答1024 的博客 🍓🍓🍓欢迎来到 请回答1024的博客 关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开…

SpringBoot引入第三方jar包或本地jar包

idea2018创建spring boot项目 New Project窗口选择Spring Initializr Type选择Maven(Generate…),有两个Maven选择这一个。 勾选Spring Web。 pom.xml中version改成2.5.10。 在resources中新建jar目录,将第三方jar包fastjson2-2.0.47.jar放入其中。&#xff08…

国产FTP文件传输服务器需要具备哪些关键特性?

国产FTP文件传输服务器是指根据中国国内信息技术创新(信创)的要求和标准,自主研发的文件传输服务器软件。这类软件旨在替代传统的FTP服务器,以更好地适应国产化和信息安全的需要。国产FTP文件传输服务器通常需要具备以下要求&…

【ensp】网关冗余vrrp实验

基础文字知识复习时,添加,下文仅拓扑以及核心配置以及结果分析 冗余路由器 核心代码: int g0/0/0 [R1-GigabitEthernet0/0/0]vrrp vrid 1 virtual-ip 192.168.10.1 ###设置虚拟ip [R1-GigabitEthernet0/0/0]vrrp vrid 1 priority 120 …

零碳家庭 “光”的力量

有行业专家乐观预测,在供给充足、基础设施建设与时俱进的情况下,2025年,我国新能源汽车市场的占有率将会达到50%,2030年更有望突破90%的大关。为了方便新能源汽车的出行,在家中安装一个智能充电桩是越来越多驾驶者的选…

分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测

分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测 目录 分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.RIME-BP霜冰优化BP神经网络多特征分类预测(Matlab实现完整源码和数据&a…

免杀技术之白加黑的攻击防御

一、介绍 1. 什么是白加黑 通俗的讲白加黑中的白就是指被杀软列入到可信任列表中的文件。比如说微软自带的系统文件或者一些有有效证书签名的文件,什么是微软文件,或者什么是有效签名文件在后面我们会提到他的辨别方法。黑就是指我们自己的文件,没有有…

【MCU】栈溢出问题

项目场景: 硬件:STM32F407,操作系统:rt_thread master分支 问题描述 问题栈溢出 id 499 ide 00 rtr 00 len 8 9 Function[rt_completion_wait] shall not be used in ISR (0) assertion failed at function:rt_completion_wait,…

屏幕状态自动检测+鼠标自动操作

目录 一、写在前面 1.1适用场景 1.2涉及到的库 二、函数库 2.1pyautogui-屏幕截图&鼠标操作 2.1.1屏幕截图screenshot函数 2.1.2鼠标移动及单击 2.2Opencv-模板匹配 2.2.1matchTemplate函数 2.2.2minMaxLoc函数 2.2.3相关代码 2.3base64-图片转base64 2.3.1在线…

Spring MVC和Spring Boot

上节已经提到过请求,这次梳理响应。 响应 响应基本上都要被Controller所托管,告诉Spring帮我们管理这个代码,我们在后面需要访问时,才可以进行访问,否则将会报错。并且其是由RestController分离出来的,Re…

java使用trim方法和replaceAll方法去除空格之后,还存在空格

今天使用其他人的一个功能,发现生成的映射少了一个,后面去代码里面debug发现是字符串中左边空格没有去除导致。查看代码,里面是使用了字符串.trim().replaceAll(" ", "")去除空格的。这个代码虽然能去除(半角…

[Java EE] 多线程(四):线程安全问题(下)

1.5 volatile关键字 我们在了解这个关键字之前,我们首先要把产生线程安全的第4个原因补齐,我们来说说由于内存可见性引起的线程安全问题. 我们来看下面这样一段代码: import java.util.Scanner;public class Demo16 {public static int count 0;public static void main(Str…

深度学习算法简介(一)

目录 ⛳️推荐 前言 1、深度神经网络(DNN) 2、卷积神经网络(CNN) 3、残差网络(ResNet) 4、LSTM(长短时记忆网络) 5、Word2Vec 6、Transformer 7、生成对抗网络(…

kmeans实现图像像素分类

代码 import tkinter as tkfrom tkinter import filedialogfrom PIL import Image, ImageTkimport numpy as np import random import mathclass Cluster(object):def __init__(self):# pixels是像素的意思,这里定义一个像素组用来存放像素的值self.pixels []# 创…