二十三种设计模式第十四篇--策略模式

news/2024/11/29 19:50:20/

策略模式:主要围绕一个类的行为或者其算法在运行时更改,也是一种行为型模式。

在软件开发中,我们经常遇到需要根据不同的情况选择不同算法或行为的情况。传统的做法是使用大量的条件语句来实现这种逻辑,但这样的实现方式往往难以维护和扩展。策略模式(Strategy Pattern)提供了一种优雅的解决方案,可以让我们灵活地处理多种算法和行为,同时提高代码的可维护性和可扩展性。

策略模式的意义

策略模式的主要目的是将算法的定义、实现和使用相互解耦,使得它们可以独立变化。它通过将不同的算法封装在独立的策略类中,并定义一个通用的接口或抽象类来统一它们的调用方式。这样一来,客户端只需要与通用接口交互,而不需要关心具体的算法实现细节。

策略模式的核心思想是将算法视为一个可互换的组件,客户端可以在运行时动态地选择适合的策略。这种灵活性使得策略模式特别适用于需要根据不同的条件或偏好来调整算法的情况。例如,一个电商平台可以根据用户的购买历史和偏好选择不同的优惠策略来计算商品的价格。

策略模式的实现

在策略模式中,我们通常会定义一个策略接口或抽象类,用于统一不同策略的调用方式。然后,针对每种具体的算法或行为,我们创建相应的策略类,实现策略接口,并提供具体的算法实现。

客户端在需要使用算法的地方,通过策略接口与具体的策略类进行交互。客户端可以根据实际需求,在运行时动态地选择合适的策略类,并将其注入到上下文对象中。上下文对象负责调用所选策略的算法,并返回结果给客户端。

这种结构使得我们可以灵活地添加新的策略类或修改现有的策略类,而不会对客户端代码产生影响。策略模式将算法的变化对客户端透明,使得客户端只需要关注业务逻辑,而不需要关心具体的算法实现。

策略模式的优点

使用策略模式可以带来多个优点:

  1. 灵活性和可扩展性:策略模式通过将算法封装在独立的策略类中,使得可以在运行时动态地选择和切换算法,而无需修改客户端的代码。这种灵活性使得系统更容易扩展和适应变化。
  2. 可维护性:策略模式将不同的算法或行为封装在独立的策略类中,使得代码结构清晰,易于理解和维护。每个策略类负责实现一个特定的算法,修改或调试一个策略对其他策略没有影响,降低了代码的复杂性。
  3. 代码复用:策略模式可以促进代码的复用。不同的策略类可以共享相同的接口或抽象类,从而使得相似的算法可以通过继承或实现来共享代码。这样可以避免代码的重复编写,提高开发效率。

策略模式的应用场景

策略模式在以下情况下特别适用:

  1. 当需要根据不同的条件或偏好选择不同算法或行为时,可以使用策略模式来灵活地切换和调整算法。

  2. 当有多个相似的算法或行为,但它们的实现细节不同,可以将每个算法封装在独立的策略类中,以提高代码的可读性和可维护性。

  3. 当某个算法的实现经常变化,或者希望在运行时动态地选择算法时,可以使用策略模式来避免频繁修改客户端的代码。

  4. 当需要将算法的定义、实现和使用相互解耦,以提高代码的模块化和可测试性时,策略模式也是一个很好的选择。

代码实现

在这里插入图片描述

public interface Strategy {public int doOperation(int num1, int num2);}
public class OperationAdd implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}
public class OperationMultiply implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}
public class OperationSubtract implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}
public class Context {//真实采用的策略private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}}
public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new OperationAdd());    System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationSubtract());      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationMultiply());    System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}
}

结论

策略模式是一种优秀的设计模式,它能够灵活地处理多种算法和行为,提高代码的可维护性、可扩展性和可测试性。通过将算法封装在独立的策略类中,并通过统一的接口来调用,我们可以使得算法的变化对客户端透明,从而降低了代码的耦合性。策略模式的应用可以让我们的代码更加灵活、可读和可维护,是值得推广和应用的一种设计模式。


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

相关文章

如何变更Win10系统电脑的锁屏壁纸?分享经验!怎样选择Win10电脑的锁屏壁纸?

如今我们越来越多使用WIN10系统电脑来操作办公了,win10电脑系统对比于Win7系统许多选项简化了不少,win10系统的功能也是极为强大的,有许多是跟我们之前使用过的系统不同的,我们下面就开始对Win10系统如何变更锁屏壁纸操作进行讲解…

锁定计算机怎么换头像,电脑锁屏头像怎么设置

电脑锁屏头像怎么设置 当我们安装完Windows8系统之后,感觉个性化设置(锁屏、“开始”屏幕、用户头像)不满意,该如何更改个性化设置呢?下面就给大家介绍更改Windows8系统个性化设置的方法。请参考! 电脑锁屏头像怎么设置 鼠标滑到电…

【HDFS学习】配额与存储策略

配额与存储策略 文章目录 配额与存储策略配额Name QuotasSpace QuotasStorage Type Quotas管理命令Reporting 命令 档案存储存储类型与存储策略存储类型: ARCHIVE, DISK, SSD and RAM_DISK存储策略: Hot, Warm, Cold, All_SSD, One_SSD, Lazy_Persist and Provided存储策略的生…

java项目之高校四六级报名管理系统(ssm+jsp+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的高校四六级报名管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌…

Visio安装

杂谈: 一般我们参加比赛、做实验,在写实验报告、说明书的时候,有时需要进行流程图,程序框图的绘制,使用word让人感觉心累,而Visio在这方面是非常专业的,也比较易上手。 资源:链接&am…

Visio2013激活/破解

出处:http://blog.csdn.net/keenweiwei/article/details/42780805/ 安装后,从 开始->程序-> KMSpico -> 启动 KMSpico 在这里点击大的红色按钮,稍等一会,即激活 visio 2013成功。 转载于:https://my.oschina.net/u/3732…

visio 2013 激活 办法

https://blog.csdn.net/TaoYuanKuangDao/article/details/78282999 从这下载! 公司电脑装了杀毒软件,一直激活不了,他妈的好烦 花了一个小时时间 进入安全模式,然后装软件,ok

在Django的数据库模型的类中,通常还会定义一个名叫Meta的内部类,这个类有什么作用?

在Django的数据库模型中,Meta类是一个内部类,用于定义一些与模型相关的元数据(metadata)。它提供了一种在模型类中指定各种选项和配置的方式。 以下是Meta类的一些常见用途和作用: 定义模型的数据库表名: …