设计模式之策略

简介: 设计模式之策略

策略模式介绍


策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。

image.png


策略模式建议找出负责用许多不同方式完成特定任务的类,然后将其中的算法抽取到一组被称为策略的独立类中。


它将一组行为转换为对象,并使其在原始上下文对象内部能够相互替换,原始对象就叫做上下文,它包含指向策略对象的引用并将执行行为分派给策略对象。为了改变上下文完成其工作的方式,其他对象可以使用另一个对象来替代当前链接的策略对象。


它会有一个上下文类来关联策略,通过一个成员变量存储对于每种策略的引用,它只负责将工作委派给已连接的策略对象。其中客户端在使用时会将具体的策略传递过来,此类不需要了解策略,它只需要通过同样的通用接口与所有策略进行交互就可以。


策略模式结构


  • 1、上下文


其维护指向具体策略的引用,且仅通过策略接口与该对象进行交流。

  • 2、策略接口


所有具体策略的通用接口,它声明一个上下文用于执行策略的方法。


  • 3、具体策略


实现上下文所用算法的不同策略。当上下文需要运行算法时,它会在其已连接的策略对象上调用执行方法。(上下文不了解策略,不关心自己调用了那个策略。)


  • 4、客户端


会创建一个特定策略对象并将其传递给上下文。上下文会通过某个方法,来使客户端在运行时替换相关联的策略。


适合应用场景


1、当想使用对象中不同的算法变体,且希望在运行时切换算法时。


2、当有许多仅在指向某些行为时略有不同相似类时。


3、若算法在上下文逻辑中不重要,使用该模式可以将类的业务逻辑与其算法实现细节隔离开来。


实现方式


  • 1、在上下文类中找到变动频率最高的算法,声明该算法所有变体的通用策略接口。


  • 2、在各自的类中逐一实现算法(必须实现策略接口)。


  • 3、在上下文类中通过成员变量来存储策略对象(上下文只能通过策略接口同策略对象进行交互)。


  • 4、客户端需要将上下文类和策略进行关联。


满足开闭原则;可以使用组合来代替继承;可将算法的实现与使用算法的代码隔离开;可在运行时切换对象内的算法。

装饰模式可让你更改对象的外表,策略则让你能够修改其本质。



Demo


策略接口和实现策略的类


上下文类


业务逻辑和显示结果



可以从上面的显示结果中可以看到,当在Main方法中,通过上下文类context来调用策略实现类时,可以得到不同的显示结果。这样我们在实际的业务开发中就可以根据实际情况按需进行使用,可以达到将算法和实际业务剥离的效果,减少彼此之间的耦合。


而且也满足开闭原则,我们在后期添加新算法时,可以不用修改旧算法,就可以实现功能。

目录
相关文章
|
6月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
145 0
|
6月前
|
设计模式 编解码 C++
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用(一)
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用
198 0
|
6月前
|
设计模式 存储 缓存
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用(二)
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用
111 0
|
1月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
6月前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
125 2
|
3月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
56 1
|
4月前
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
114 0
|
6月前
|
设计模式 Java
设计模式之策略 Strategy
设计模式之策略 Strategy
45 1
|
设计模式 算法 搜索推荐
设计模式—策略(Strategy)模式
设计模式—策略(Strategy)模式
153 1
|
6月前
|
设计模式 缓存 安全
分析设计模式对Java应用性能的影响,并提供优化策略
【4月更文挑战第7天】本文分析了7种常见设计模式对Java应用性能的影响及优化策略:单例模式可采用双重检查锁定、枚举实现或对象池优化;工厂方法和抽象工厂模式可通过对象池和缓存减少对象创建开销;建造者模式应减少构建步骤,简化复杂对象;原型模式优化克隆方法或使用序列化提高复制效率;适配器模式尽量减少使用,或合并多个适配器;观察者模式限制观察者数量并使用异步通知。设计模式需根据应用场景谨慎选用,兼顾代码质量和性能。
56 0