深入了解Java设计模式之策略模式
作者:小小张自由—>张有博 发布时间:2021-06-24 22:45:56
标签:Java,设计模式,策略模式
定义
定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
解决的问题
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
核心要点
把变化的代码从不变的代码中分离出来
针对接口编程而不是具体实现(类)
多用组合/聚合,少用继承
客户端通过组合的方式使用策略
类图
溢出效用
对父类的局部改动,会影响其他部分(子类)、会有溢出效应
策略模式避免使用多重条件语句,比如if-else语句、Swtich语句
缺点:客户端必须知道所有的策略类,并且自行决定使用哪一个策略类。
代码实现
核心接口
/**
* 策略接口
*
* @author Promsing(张有博)
* @version 1.0.0
* @since 2022/9/6 - 18:13
*/
public interface Strategy {
//顶层策略接口
void Strategy();
}
实现类-三个
/**
* 策略实现A
*
* @author Promsing(张有博)
* @version 1.0.0
* @since 2022/9/6 - 18:14
*/
public class ConcreteStrategyA implements Strategy{
@Override
public void Strategy() {
System.out.println("算法A实现");
}
}
/**
* 策略实现B
*
* @author Promsing(张有博)
* @version 1.0.0
* @since 2022/9/6 - 18:14
*/
public class ConcreteStrategyB implements Strategy {
@Override
public void Strategy() {
System.out.println("算法B实现");
}
}
/**
* 策略实现C
*
* @author Promsing(张有博)
* @version 1.0.0
* @since 2022/9/6 - 18:14
*/
public class ConcreteStrategyC implements Strategy{
@Override
public void Strategy() {
System.out.println("算法C实现");
}
}
Context类
/**
* 策略配置类,维护一个Strategy的引用
*
* @author Promsing(张有博)
* @version 1.0.0
* @since 2022/9/6 - 18:15
*/
public class Context {
//声明策略接口
private Strategy strategy;
//使用聚合的方式
public Context(Strategy strategy) {
this.strategy = strategy;
}
//提供set方法,支持运行时改变算法
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
//根据具体的策略对象,调用其算法的方法
public void ContextStrategy(){
strategy.Strategy();
}
}
Main方法
/**
* 策略模式启动类
*
* @author Promsing(张有博)
* @version 1.0.0
* @since 2022/9/6 - 18:19
*/
public class Main
{
//TODO:代码可以优化,new的具体算法,可以放到配置文件中。
//运行时读取配置文件
public static void main(String[] args) {
Context context;
//new 一个context对象
context=new Context(new ConcreteStrategyA());
context.ContextStrategy();
//运行时改变策略
context.setStrategy(new ConcreteStrategyB());
context.ContextStrategy();
context.setStrategy(new ConcreteStrategyC());
context.ContextStrategy();
}
}
拓展
JDK源码
Comparator接口是一个常用的比较器,其中compare()就是一个策略模式的抽象体现
public static void main2(String[] args) {
Integer[] ints={1,3,8,2,4,9,0};
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 > o2) {
return 1;
}
return -1;
}
};
Arrays.sort(ints,comparator);
System.out.println(Arrays.toString(ints));
}
Spring源码
Spring的初始化采用了策略模式,即不同类型的类采用不同的初始化策略。
策略模式的注意实现和细节
1)策略模式的关键是 :分析项目中变化部分与不变部分
2)策略模式的核心思想是 :多用组合/聚合,少用继承;用行为类组合,而不是行为的继承。更有弹性。
3)体现了“开闭原则”。客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if…else if … else);
4)提供了可以替换继承关心的办法 :策略模式将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。
5)需要注意的是 :每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大。
来源:https://blog.csdn.net/promsing/article/details/126737647


猜你喜欢
- 这节主要完成一些基本的增删改查以及Service、Dao和Action的抽取。1. Service层的抽取  
- 学过C#的人应该都知道抽象方法与虚拟方法,而很多初学者对二者之间的区别并不是很了解。今天本文就来分析一下二者之间的区别。并附上实例加以说明。
- 本文实例为大家分享了java常用工具类的具体代码,供大家参考,具体内容如下Random随机数工具类package com.jarvis.ba
- 1.二叉树的概念及结构 ①概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二
- 原由移动开发中,随着项目不断的跌代,需求越来越复杂后。项目工程也越来越庞大。那么此时的分module的开发,则是必然的选择了。在最终的组件化
- 最近在开发项目的时候遇到一个问题,在myecilpes上使用googlede gson读取项目中的json文件成功,然后把项目发布到tomc
- c# Invoke与BeginInvoke最近在学习线程时,发现当我创建的线程需要访问UI界面的时,会发生异常,原因是我在跨线程调用主线程的
- 本文实例讲述了C#将Json解析成DateTable的方法。分享给大家供大家参考。具体实现方法如下:#region 将 Json 解析成 D
- 添加NuGet包选择最新版就好了安装完成后右键项目重新生成方案使用OpenCvSharp.CPlusPlus命名空间using OpenCv
- /// <summary> /// 导出Ex
- 本文将介绍一段实例代码,来讲解利用正则表达式使C#判断输入日期格式是否正确的方法。希望这段代码能对大家有所帮助。 通常我们在用C#
- 在Android开发过程中,有时需要获取触摸位置的坐标,以便作进一步处理,比如做炫酷的动画效果,或者响应其他操作。本文简单介绍Android
- 前提:集成开发环境(IDE):eclipsejdk版本:8.0File类的几个方法:1)isFile()测试此抽象路径名表示的文件是否为普通
- Java异常是Java提供的一种识别及响应错误的一致性机制。Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅
- 在 .NET 5.0 的发布中,不仅统一了框架,微软还在C#9.0中推出了一些新特性。本版本中,印象深刻的功能:Init-only sett
- 一、问题描述今天使用SDK Manager将Android SDK的版本更新到了Android 5.1的版本,eclipse创建androi
- 本文实例讲述了C#中const用法。分享给大家供大家参考。具体用法分析如下:const是一个c语言的关键字,它限定一个变量不允许被改变。使用
- 这是进行Java Web开发必备的一个过程,仅供新手参考,高手可以忽略!JDK 和 JRE 的区别JRE(Java Runtime Envi
- 在工作中,如果需要跟XML打交道,难免会遇到需要把一个类型集合转换成XML格式的情况。之前的方法比较笨拙,需要给不同的类型,各自写一个转换的
- Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无