首页 > 编程语言 >java设计模式(十四)策略模式(Strategy Pattern)

java设计模式(十四)策略模式(Strategy Pattern)

时间:2024-07-12 13:56:48浏览次数:17  
标签:java 策略 Pattern void strategy SortingStrategy 设计模式 data public

1、模式介绍:

策略模式是一种行为设计模式,它定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

2、应用场景:

当一个对象有多种行为,而需要动态选择一种行为时。
不同的策略可以实现不同的行为,客户端根据需要在运行时选择合适的策略。
当需要避免使用大量的条件判断语句来选择不同的行为时,可以使用策略模式来提高代码的可维护性。

3、优点:

策略模式提供了一种可以替换继承关系的方法,可以独立于客户端改变算法,易于扩展。
可以避免使用多重条件语句。
策略类之间可以自由切换,易于修改和测试。

4、缺点:

客户端必须了解所有的策略,并在适当的时候选择合适的策略,增加了客户端的复杂度。
策略模式会造成很多的策略类,增加了系统的对象数量。

5、代码示例:

/**
 * 排序策略接口
 *
 * @author FM_南风
 * @date 2024/7/3
 */
interface SortingStrategy {
   void sort(int[] data);
}

/**
 * 冒泡策略
 *
 * @author FM_南风
 * @date 2024/7/3
 */
public class BubbleSortStrategy implements SortingStrategy{
    @Override
    public void sort(int[] data) {
     // 冒泡排序算法实现
     System.out.println("使用冒泡算法实现");
    }
}

/**
 * 快速排序实现
 *
 * @author FM_南风
 * @date 2024/7/3
 */
public class QuickSortStrategy implements SortingStrategy{
	@Override
	public void sort(int[] data) {
		// 快速排序算法实现
		System.out.println("快速排序算法实现");
	}
}

/**
 * 环境类(Context)
 *
 * @author FM_南风
 * @date 2024/7/3
 */
public class Sorter {
	private SortingStrategy strategy;

	public Sorter(SortingStrategy strategy) {
		this.strategy = strategy;
	}

	public void setStrategy(SortingStrategy strategy) {
		this.strategy = strategy;
	}

	public void performSort(int[] data) {
		strategy.sort(data);
	}
}

/**
 * 应用
 *
 * @author FM_南风
 * @date 2024/7/3
 */
public class StrategyClient {
    public static void main(String[] args) {
       int[] data = {5, 1, 3, 6, 4, 2};

       Sorter sorter = new Sorter(new BubbleSortStrategy());
       sorter.performSort(data); // 使用冒泡排序策略

       sorter.setStrategy(new QuickSortStrategy());
       sorter.performSort(data); // 使用快速排序策略
    }
}

6、结果展示:

标签:java,策略,Pattern,void,strategy,SortingStrategy,设计模式,data,public
From: https://blog.csdn.net/weixin_70044963/article/details/140163801

相关文章

  • [Java]“不同族”基本数据类型间只能“强转”吗?
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18298193出自【进步*于辰的博客】本文阐述需要计算不同位二进制的表示范围,引用博文《[MySQL]知识点》中的【数据范围通式】一栏得出的计算公式。虽然Java与MySQL属不同体系,......
  • Java性能优化-switch-case和if-else速度性能对比,到底谁快?
    场景Java中使用JMH(JavaMicrobenchmarkHarness微基准测试框架)进行性能测试和优化:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131723751参考以上性能测试工具的使用。下面针对Java中对switch-case和if-else在速度方面的性能做测试。注:博客:https://blog......
  • java实现浅拷贝与深拷贝
    目录浅拷贝 深拷贝实现cloneable接口序列化浅拷贝浅拷贝是指创建一个新的对象,该对象的内容是原始对象中各项的引用。换句话说,浅拷贝仅复制了原始对象中元素的引用,而不是元素本身的拷贝classPeopleimplementsCloneable{privateStringname;privateint......
  • 【日常记录-Java】自定义进程池
    Author:赵志乾Date:2024-07-12Declaration:AllRightReserved!!!1.简介    服务器上有些进程需要池化管理,使用SpringBoot构建Web服务提供管理api,内部使用自定义的进程池维护已启动的进程;    核心点: 进程池管理的进程都会使用系统的一个端口对外提供服务; ......
  • AC_patterns的生成过程
    at-speed技术用来测试电路正常工作的时序是否有问题,进而确定电路能否正常工作。这种技术测试的故障叫做transitionfault,同样这种技术也叫transitionfaulttest。想要实现这种技术,一对测试pattern(V1,V2),需要应用到测试电路当中(CircuitUnderTest,CUT)。V1用来初始化电......
  • c/c++设计模式---访问者模式
    访问者(Visitor)模式:访问器模式,行为型模式。  //(1)一个具体范例的逐渐演化  //阿司匹林肠溶片:改善血液流通,预防血栓形成,血栓形成就产生阻塞,人就会直接面临危险;  //氟伐他汀钠缓释片:降血脂。因为血脂高意味着血流慢,营养无法运输到身体各部位,还很可能引发心脑血管疾病;......
  • Java怎么统计每个项目下的每个类别的数据
    为了演示如何在Java中统计每个项目下的每个类别的数据,我们可以考虑一个简单的场景:假设我们有一个电商系统,需要统计每个商品分类在每个店铺下的销售数量。这里我们将使用Java的集合框架,如HashMap和ArrayList,来存储和统计数据。1.使用Java的集合框架HashMap和ArrayList来存储和统计......
  • 关于Java内存区域的理解和记录
    近期做项目遇到了FullGC的问题,干脆总结一下Java内存区域分布和垃圾回收是咋回事。Java内存区域按照线程隔离状态直接分成三大块空间:线程私有:程序计数器是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器。在虚拟机概念模型里,字节码解释器工作时就是通过改变这......
  • Java中的递归算法详解
    Java中的递归算法详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.什么是递归算法?递归算法是指在函数的定义中使用函数自身调用的方法。在算法中,递归通常用于解决可以被拆分为相似子问题的问题,每个子问题都是原始问题的一部分。2.递归算法的基本......
  • Java中的反序列化详解
    Java中的反序列化详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.什么是反序列化?反序列化是将对象的字节序列转换回对象的过程。在Java中,对象序列化是将对象转换为字节序列以便存储或传输,而反序列化则是将这些字节序列重新转换为对象。2.Java中......