经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
软件设计模式白话文系列(十四)策略模式
来源:cnblogs  作者:Eajur  时间:2022/11/23 18:51:28  对本文有异议

1、模式描述

定义一个算法的系列,将其各个分装,并且使他们有交互性。策略模式使得算法在用户使用的时候能独立的改变。

在 Java 中,从 JDK1.8 开始支持函数式编程,就是策略模式的一种体现,且无需借助额外的类和接口,代码更加简洁。

2、模式结构

  • 抽象策略类:定义策略算法的规范。
  • 具体策略类:实现抽象策略类,提供具体的算法实现或行为。
  • 环境类:持有抽象策略类的引用,由客户端构造时,客户制定具体使用策略类。

3、实现逻辑

定义一个抽象类或接口(抽象策略类),定义出算法或行为规范;再实现多个具体策略类;定义环境类持有抽象引用;在客户端调用动态选择策略。

4、实战代码

模拟创建证书时使用不同算法创建密钥。

  1. /**
  2. * 抽象策略类
  3. *
  4. * @author Eajur.Wen
  5. * @version 1.0
  6. * @date 2022-11-16 18:11:19
  7. */
  8. public interface KeyAlgorithm {
  9. void getAlgorithm();
  10. }
  11. /**
  12. * 具体策略类
  13. *
  14. * @author Eajur.Wen
  15. * @version 1.0
  16. * @date 2022-11-16 18:13:26
  17. */
  18. public class RsaAlgorithm implements KeyAlgorithm {
  19. @Override
  20. public void getAlgorithm() {
  21. System.out.print("使用 RSA 算法");
  22. }
  23. }
  24. /**
  25. * 具体策略类
  26. *
  27. * @author Eajur.Wen
  28. * @version 1.0
  29. * @date 2022-11-16 18:13:26
  30. */
  31. public class Sm2Algorithm implements KeyAlgorithm {
  32. @Override
  33. public void getAlgorithm() {
  34. System.out.print("使用 SM2 算法");
  35. }
  36. }
  37. /**
  38. * 具体策略类
  39. *
  40. * @author Eajur.Wen
  41. * @version 1.0
  42. * @date 2022-11-16 18:13:26
  43. */
  44. public class EcdsaAlgorithm implements KeyAlgorithm {
  45. @Override
  46. public void getAlgorithm() {
  47. System.out.print("使用 ECDSA 算法");
  48. }
  49. }
  50. /**
  51. * 环境类
  52. *
  53. * @author Eajur.Wen
  54. * @version 1.0
  55. * @date 2022-11-16 18:16:42
  56. */
  57. public class Certificate {
  58. private KeyAlgorithm keyAlgorithm;
  59. public Certificate(KeyAlgorithm keyAlgorithm) {
  60. this.keyAlgorithm = keyAlgorithm;
  61. }
  62. public void creatCertificate() {
  63. keyAlgorithm.getAlgorithm();
  64. System.out.println("创建证书");
  65. }
  66. }
  67. /**
  68. * 测试类
  69. *
  70. * @author Eajur.Wen
  71. * @version 1.0
  72. * @date 2022-11-16 18:22:13
  73. */
  74. public class Client {
  75. public static void main(String[] args) {
  76. new Certificate(new Sm2Algorithm()).creatCertificate();
  77. new Certificate(new RsaAlgorithm()).creatCertificate();
  78. new Certificate(new EcdsaAlgorithm()).creatCertificate();
  79. }
  80. }

将创建证书时生成密钥使用的算法控制权交与客户端。

5、适用场景

  • 需要在运行时,动态选择对象内算法。
  • 需要客户端调用时自主选择算法。

6、策略模式和桥接模式区别

策略模式属于对象行为型模式,而桥接模式属于结构型模式。

两种模式都存在一个对象使用聚合的方式引用另一个对象的抽象接口的情况,而且接口的实现可以有多种提供给客户端选择。但相对于策略模式,桥接模式表示的内容更多,结构更复杂,主要目的实现接口隔离原则,即把本质上并不内聚的两种体系区分开来,而策略模式只是算法的层次,没有达到体系层次。从结构上看,桥接模式是包括策略模式,可以看成策略模式的 Plus 版。

6、策略模式和模版模式区别

策略模式属于对象行为模式,基于组合机制,在对象层次运作,允许在运行时切换行为。

模版方法模式属于类行为模式,基于继承机制,允许通过扩展子类的部分内容来改变部分算法。

模版方法是调整流程中部分算法或流程的处理,策略模式前调完全替换整个算法。

原文链接:https://www.cnblogs.com/eajur/p/16917864.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号