设计模式二十四章经之策略模式
时间:2022-06-01
本文章向大家介绍设计模式二十四章经之策略模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天有人看了我之前的推文,说我的作息不正常,我就这么被diss了。当然了,懂的人自然懂,不懂的人和他说到最后就是对喷。我也就懒得解释了,下面进入正文。
概述
策略模式在我们日常开发中也是经常遇见的。比如实现某一个功能有多种算法或者策略。我们根据具体情况去实现它。例如:排序算法,我们可以使用插入、冒泡、快排等等。
针对这种情况,我们一般将多个策略写在一个工具类中去方便调用。我们需要A策略就是调用A方法,需要B策略就调用B方法。
如果将这些算法或者策略抽象出来,变成一个接口,不同的策略有不同的实现类。这样我们就可以通过注入不同的对象去实现策略的动态替换,这种模式可扩展和可维护性都很高。
使用场景
1、针对同一类型的问题多种的处理方法。
2、需要安全的封装多种同一类型的操作时。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
具体实现
创建一个接口:
public interface Strategy {
public int doOperation(int num1, int num2);
}
创建2个实体类去实现此接口:
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
public class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
现在我们创建一个工具类:
public class Utils {
private Strategy strategy;
public Utils(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
最后我们在主函数中去实现:
public class Demo {
public static void main(String[] args) {
Utils utils = new Utils(new OperationAdd());
System.out.println("10 + 5 = " + utils.executeStrategy(10, 5));
context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + utils.executeStrategy(10, 5));
}
}
输出:
10 + 5 = 15
10 - 5 = 5
总结
策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。这个模式很好的演示的开闭原则,也就是定义抽象,注入不同的实现,从而达到更好的可扩展性。
优点:
- 结构清晰明了,使用简单直观
- 耦合度相对而言较低,扩展方便
- 操作封装更为彻底,数据安全
缺点:
- 随着策略的增加,子类也会变得繁多。
- 所有策略类都需要对外暴露。
- 初探Kotlin+SpringBoot联合编程
- 【Leetcode 303】关关的刷题日记67–Leetcode 303 Range Sum Query – Immutable
- 【Leetcode 70】关关的刷题日记68 – Leetcode 70 Climbing Stairs
- Linq 集合操作
- 【Leetcode 198】关关的刷题日记69 – Leetcode 198 House Robber
- 【关关的刷题日记60】Leetcode 437. Path Sum III
- Easyui DataGrid DateRange Filter 漂亮实用的日期区间段筛选功能
- Python黑帽编程2.3 字符串、列表、元组、字典和集合
- AssemblyExecuteAdapter
- MySQL入门学习笔记——七周数据分析师实战作业
- 左手用R右手Python系列——七周数据分析师学习笔记R语言、Python版
- Python Numpy学习教程(一)Python篇
- MySQL数据库基础——本地文件交互
- 左手用R右手Python系列之——noSQL基础与mongodb入门
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Head First设计模式——代理模式
- [Maven]告警[WARNING] Unable to create Maven project from repository.
- Head First设计模式——复合模式
- [System.currentTimeMillis]/[Calendar.getInstance().getTimeInMillis()]/[new Date().getTime()]
- 【每日一题】32. Longest Valid Parentheses
- 面经手册 · 第3篇《HashMap核心知识,扰动函数、负载因子、扩容链表拆分深度学习(+实践验证)》
- Head First设计模式——桥接模式
- Head First设计模式——生成器模式和责任链模式
- Head First设计模式——蝇量模式和解释器模式
- 【每日一题】33. Search in Rotated Sorted Array
- 【每日一题】34. Find First and Last Position of Element in Sorted Array
- 【每日一题】35. Search Insert Position
- Head First设计模式——原型模式和访问者模式
- Java 新特性前瞻:封印类
- 每天手撕一道算法题-130. 被围绕的区域