java设计模式之策略模式
时间:2022-07-26
本文章向大家介绍java设计模式之策略模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目录
一、策略模式(Strategy Pattern)
策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,也可以设计一个抽象类(可有可无,属于辅助类),提供辅助函数
策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。
二、 demo:
//统一的接口
/**
* Created by yjl on 2020/9/30.
* 策略模式:博文介绍链接:https://blog.csdn.net/qq_27471405/article/details/108886135
* 统一的接口
*/
public interface ICalculator {
public int calculate(String exp);
}
//抽象类,作为辅助类,可以提供一些你认为需要的方法
/**
* Created by yjl on 2020/9/30.
* 策略模式:博文介绍链接:https://blog.csdn.net/qq_27471405/article/details/108886135
* 提供算法的方法辅助类
*/
public abstract class AbstractCalculator {
/**
* 算法处理方法一
* @param exp
* @param opt
* @return
*/
public int[] split(String exp,String opt){
String array[] = exp.split(opt);
int arrayInt[] = new int[2];
arrayInt[0] = Integer.parseInt(array[0]);
arrayInt[1] = Integer.parseInt(array[1]);
return arrayInt;
}
public int[] split2(String exp,String opt){
System.out.println("这里可以放其他算法等方法");
return new int[]{2,5,11};
}
}
//接口的三个实现类: PlusService:
/**
* Created by yjl on 2020/9/30.
* 策略模式:博文介绍链接:https://blog.csdn.net/qq_27471405/article/details/108886135
* 加法服务
*/
public class PlusService extends AbstractCalculator implements ICalculator{
@Override
public int calculate(String exp) {
int arrayInt[] = split(exp.toString(),"[+]");
return arrayInt[0]+arrayInt[1];
}
}
MinusService:
/**
* Created by yjl on 2020/9/30.
* 策略模式:博文介绍链接:https://blog.csdn.net/qq_27471405/article/details/108886135
* 减法服务
*/
public class MinusService extends AbstractCalculator implements ICalculator {
@Override
public int calculate(String exp) {
int arrayInt[] = split(exp.toString(),"-");
return arrayInt[0]-arrayInt[1];
}
}
MultiplyService:
/**
* Created by yjl on 2020/9/30.
* 策略模式:博文介绍链接:https://blog.csdn.net/qq_27471405/article/details/108886135
* 乘法服务
*/
public class MultiplyService extends AbstractCalculator implements ICalculator {
@Override
public int calculate(String exp) {
int arrayInt[] = split(exp.toString(),"[*]");
return arrayInt[0]*arrayInt[1];
}
}
当然,想要加其他的可以继续加,符合开闭原则,要对扩展开放
//测试类
public class TestStrategy {
public static void main(String[] args) {
String exp = "10-3";
ICalculator cal = new MinusService();
int result = cal.calculate(exp);
System.out.println(exp+":"+result);
}
}
三、项目地址:
- SVG - 基本的SVG属性
- SVG - 创建SVG图片
- 移动端框架 滚动类 iScroll5
- GoogLeNet的心路历程(二)
- iScroll5 表单元素无法失焦 解决方法
- ResNet原理及其在TF-Slim中的实现
- 了解你服务器的心情——top命令详解
- HTML5视音频代码实例 & WEBM格式转换器
- 解析Tensorflow官方PTB模型的demo
- MyBatis源码解析(一)——MyBatis初始化过程解析
- MyBatis源码解析(二)——动态代理实现函数调用
- Git命令速记
- linux设备驱动第三篇:如何写一个简单的字符设备驱动
- Tensorflow高级API的进阶--利用tf.contrib.learn建立输入函数
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- [OHIF-Viewers]医疗数字阅片-医学影像-Redux中的reducer到底是什么,以及它为什么叫reducer?
- 【从零开始用Swift开发一个iOS应用(仿微博)】开篇-1. demo上手体验
- 数据结构与算法-二维数组中的查找
- 卷积神经网络之 - GoogLeNet / Inception-v1
- 卷积神经网络之 - Alexnet
- Linux系列之学会使用Top命令进行系统监控
- 一简单线程同步笔试题分享,欢迎纠错分享更多思路
- 卷积神经网络之-NiN 网络(Network In Network)
- 【注意力机制】空间注意力机制之Spatial Transformer Network
- 【小技巧】用Python给你的视频添加字幕
- 震惊!我三步就搞定了 Tomcat 源码环境搭建!
- 【小技巧】深度学习中的那些效率提升利器(附资源)
- 多个线程为了同个资源打起架来了,操作系统是如何让他们安分的?
- 学习链表,这些题你值得一刷!
- Gophish钓鱼测试