a. 探索策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装到一个具有共同接口的独立类中,使得它们可以相互替换。策略模式可以使算法的变化独立于使用它的客户端。
b. 编写实例:策略模式实践
我们将通过一个简单的示例来演示策略模式的实现。假设我们正在开发一个电商平台,该平台支持多种支付方式,如支付宝、微信支付等。我们可以使用策略模式来实现支付功能。
首先,定义一个支付策略接口:

public interface PaymentStrategy {void pay(double amount);
}

接下来,实现具体的支付策略类:

public class AlipayStrategy implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用支付宝支付:" + amount + "元");}
}public class WechatPayStrategy implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("使用微信支付:" + amount + "元");}
}

然后,创建一个支付上下文类,用于执行支付策略:

public class PaymentContext {private PaymentStrategy paymentStrategy;public PaymentContext(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void executePayment(double amount) {paymentStrategy.pay(amount);}
}

最后,客户端可以根据用户的选择来调用不同的支付策略:

public class Client {public static void main(String[] args) {PaymentContext context = new PaymentContext(new AlipayStrategy());context.executePayment(100.0);context = new PaymentContext(new WechatPayStrategy());context.executePayment(200.0);}
}

c. 优缺点分析:策略模式的双重影响

优点:

1、提高了代码的可维护性和可扩展性:策略模式将不同的算法进行了封装,使得它们可以相互替换,方便地添加新的算法。
2、遵循了开放封闭原则:策略模式允许我们在不修改客户端代码的情况下,添加新的算法。
3、避免了过多的条件判断:策略模式可以替换掉复杂的条件判断,提高代码的可读性。

缺点:

1、增加了代码的类数量:每个策略都需要一个具体的实现类,导致类数量的增加。
2、客户端需要了解所有的策略类:客户端需要知道所有的策略类,并根据具体的需求选择合适的策略类。这可能导致客户端代码的复杂性增加。

d. 策略模式在开源框架中的应用

在实际开发中,策略模式广泛应用于各种开源框架中。例如,Java中的排序算法就采用了策略模式。Collections.sort()方法允许你传入一个Comparator对象,该对象实现了比较策略,从而实现了自定义排序。

public class Employee {private String name;private int age;// Getter and Setter methods
}class EmployeeComparatorByAge implements Comparator<Employee> {@Overridepublic int compare(Employee e1, Employee e2) {return e1.getAge() - e2.getAge();}
}public class Main {public static void main(String[] args) {List<Employee> employees = new ArrayList<>();// Add employees to the list// Sort employees by age using the custom comparatorCollections.sort(employees, new EmployeeComparatorByAge());}
}

另一个例子是Spring框架中的资源解析策略。根据不同的资源类型(如文件、类路径、URL等),Spring框架使用了不同的资源解析策略。这些策略都实现了Resource接口,通过ResourceLoader根据资源路径自动选择合适的策略。
总之,策略模式是一种非常实用的设计模式,可以帮助我们在面对变化的需求时,保持代码的可维护性和可扩展性。通过了解和实践策略模式,我们可以更好地应对各种复杂的开发场景。

二十六:策略模式:灵活的决策力相关推荐

  1. 【OS学习笔记】二十六 保护模式八:任务门---任务切换

    上一篇文章学习了:保护模式七:调用门与依从的代码段----特权级保护 主要学习了以下内容: 描述符特权级(目标对象的特权级)DPL 描述符特权级(目标对象的特权级)DPL 当前特权级CPL 低特权级的 ...

  2. 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码

    本汇编代码对应以下两篇文章对应的用户程序汇编代码: [OS学习笔记]二十六 保护模式八:任务门-任务切换 [OS学习笔记]二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中 ...

  3. 【OS学习笔记】二十八 保护模式八:任务切换对应的汇编代码之内核代码

    本汇编代码对应以下两篇文章对应的内核汇编代码: OS学习笔记]二十六 保护模式八:任务门-任务切换 [OS学习笔记]二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套 ...

  4. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...

  5. Shell脚本学习-阶段二十六-Web服务与端口

    文章目录-Shell阶段二十六-端口与服务对照表 前言 端口与Web服务对照表 简介 前言 端口与Web服务对照表 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口: ...

  6. 知识图谱论文阅读(八)【转】推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现

    学习的博客: 推荐系统遇上深度学习(二十六)–知识图谱与推荐系统结合之DKN模型原理及实现 知识图谱特征学习的模型分类汇总 知识图谱嵌入(KGE):方法和应用的综述 论文: Knowledge Gra ...

  7. 2021年大数据Hadoop(二十六):YARN三大组件介绍

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn三大组件介绍 ResourceManager No ...

  8. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  9. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  10. GPS从入门到放弃(二十六) --- RTKLIB函数解析

    GPS从入门到放弃(二十六) - RTKLIB函数解析 为了贴合这个系列的标题"从入门到放弃",在入门之后现在就要放弃此方向了.虽然感觉遗憾,暂时也没有办法.在此附上此系列最后一篇 ...

最新文章

  1. php的htaccess,.htaccess
  2. FreeBSD手册——配置FreeBSD内核
  3. IM热门功能讨论:为什么微信里没有消息“已读”功能?...
  4. C#机房重构-总结(二)
  5. 解决com.alibaba.fastjson.JSONException: autoType is not support
  6. Fragment使用PagerSlidingTabStrip嵌套子Fragment显示问题
  7. 值类型和引用类型的区别,应该很全的。
  8. netty keepalive 和 idle 的关系
  9. 网友希望一加7像iPhone XR一样流畅 刘作虎:iPhone很卡
  10. Win10电脑定时关机无效怎么办
  11. winform利用html开发,Winform开发框架之HTML编辑控件介绍
  12. AI系统可以自动生成逼真的人工星系图像
  13. 网络的层级及各层级的作用
  14. 如何消除图片中的运动模糊?
  15. warning CS0108: `___' hides inherited member `___'. Use the new keyword if hiding was intended解决办法
  16. 从0到1:CTFer成长之路docker环境搭建
  17. python内存持续增长_Python 进程内存增长解决方案
  18. PHP服务器获取客户端IP地址
  19. 秒杀项目学习笔记-异常处理
  20. 大咖们如何评判优秀架构师?

热门文章

  1. 处理/root/jdk8/jdk1.8.0_241/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or di错误
  2. 智慧环保综合解决方案 大数据打造生态治理系统平台
  3. Linux用户组管理
  4. 项目众包 开源项目_如何通过开源项目获利并保持活力
  5. storm流式计算的应用案例
  6. java html转excel
  7. 03.福大本科生毕设导师双向选择系统_需求分析和原型设计
  8. 安全左移理念,腾讯DevSecOps如何实践?
  9. CockroachDB的raft优化
  10. uniapp 10进制、字符串转16进制码