3.9设计模式——Strategy 策略模式(行为型)

news/2024/9/25 8:23:14/

意图

定义一系列的算法,把它们一个个封装起来,并且使他们可以相互替换此模式使得算法可以独立于使用它们的客户而变化

结构

  • Strategy(策略)定义所有支持的算法的公共入口。Context使用这个接口来调用某ConcreteStrategy定义的方法。
  • ConcreteStrategy(具体策略)以Strategy接口实现某个具体算法。
  • Context(上下文)用一个ConcreteStrategy对象来配置;维护一个对Strategy对象的引用;可定义一个接口来让Strategy访问它的数据
  • AlgorithmInterface(算法接口)

适用性

  • 许多相关的类仅仅是行为有异,“策略“”提供了一种用多个行为中的一个行为来配置一个类的方法。
  • 需要使用一个算法的不同变体。例如,定义一些反应不同空间的空间、时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式
  • 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、和算法相关的数据结构。
  • 一个类定义了多种行为,并且这些行为在这类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的Strategy类中,以替代这些条件语句。

代码示例

java">// 策略接口(Algorithm Interface)
interface PaymentStrategy {void pay(int amount);
}// 具体策略类
class CreditCardPayment implements PaymentStrategy {private String cardNumber;private String cvv;public CreditCardPayment(String cardNumber, String cvv) {this.cardNumber = cardNumber;this.cvv = cvv;}@Overridepublic void pay(int amount) {System.out.println("使用信用卡支付 " + amount + " 元。");// 实现信用卡支付}
}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(int amount) {System.out.println("使用PayPal支付 " + amount + " 元。");// 实现PayPal支付}
}// 上下文类
class PaymentContext {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void makePayment(int amount) {paymentStrategy.pay(amount);}
}// 主类
public class Main {public static void main(String[] args) {PaymentContext context = new PaymentContext();// 使用信用卡支付策略context.setPaymentStrategy(new CreditCardPayment("1234 5678 9012 3456", "123"));context.makePayment(100);// 使用PayPal支付策略context.setPaymentStrategy(new PayPalPayment("example@example.com", "password123"));context.makePayment(50);}
}


http://www.ppmy.cn/news/1447528.html

相关文章

latex+vscode一直报错,配置文件json和环境变脸配置

1、json配置文件 {"latex-workshop.latex.tools": [{"name": "xelatex","command": "xelatex","args": ["-synctex1","-interactionnonstopmode","-file-line-error","%DOCF…

深度学习之基于CIFAR10图像分类可视化

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习之基于CIFAR-10图像分类可视化项目简介 一、项目背景 随着深度学习和计算机视觉技术的飞速发展&#xff…

【Unity动画系统】详解Root Motion动画在Unity中的应用(一)

Root Motion动画与普通动画的区别 普通动画:动画文件里记录的是物体的绝对坐标和方向,在播放动画时,Unity会根据Animation中记录的值,直接修改游戏对象的坐标和方向,每一帧的坐标和方向都是通过插值计算得出来的&…

优化大型语言模型交互:提升查询和提示效果的26条原则

推荐下arxiv挂的一个提示词教程: https://github.com/VILA-Lab/ATLAS https://arxiv.org/abs/2312.16171 它提出了一套26条指导原则,改善和优化与大型语言模型(LLMs)的交互过程。通过这些原则,旨在简化对LLMs的查询和…

javascrip对象如何区分属性和方法

在JavaScript中,对象是由属性和方法构成的。属性是对象的特征或状态,而方法是对象能够执行的动作。 属性的特点: 属性是对象的成员,用来描述对象的状态或特征。属性可以是基本数据类型(如字符串、数字、布尔值等&…

什么是软件数字签名?软件数字签名的重要性

用户在互联网下载软件、应用程序、安装插件时,必须确信该代码是真实可信、没有受感染或被篡改。软件数字签名机制就是通过数字签名技术和身份认证技术,为软件代码附上可信身份证明并保护代码完整性,防止软件代码被仿冒或篡改。访问沃通CA官网…

IDEA:运行 Tomcat 报错 “1099”

1、报错的结果 报错 就很明显啊 localhost:1099 端口号被使用了 2、报错原因 tomcat的端口已经被使用,与运行的起了冲突。强制结束项目,但端口号没有被释放短时间内频繁运行tomcat服务器。 3、解决方法 win R 输入 cmd 打开命令框 黑窗口输…

GateWay具体的使用之局部过滤器接口耗时

1.找规律 局部过滤器命名规则 XXXGatewayFilterFactory, 必须以GatewayFilterFactory结尾。 /* 注意名称约定 * AddRequestHeaderGatewayFilterFactory 配置的时候写的是 AddRequestHeader * AddRequestParameterGatewayFilterFactory 配置的时候写的是 A…