Java23种设计模式-行为型模式之策略模式

2024-04-26 12:04

本文主要是介绍Java23种设计模式-行为型模式之策略模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

策略模式(Strategy Pattern):将算法的使用从算法的实现中分离出来,从而让算法的变化不会影响到使用算法的用户

通常涉及三个角色
1.上下文(Context):持有策略接口的引用,并在运行时根据需要更换具体的策略实现
2.策略接口(Strategy):定义了所有可能的算法实现应该遵循的协议
3.具体策略实现(Concrete Strategy):实现则实现了这些协议,并为特定的算法提供具体的实现

优点
1.算法的变化不会影响到客户端。
2.可以轻松地切换不同的算法。
3.可以动态地选择不同的算法。

缺点
1.客户端必须知道所有的策略类,至少是它们的接口。
2.可能会增加系统中的类的数量。

应用场景
当一个系统需要多种算法变体时。
当这些算法相互之间是等价的,且可以互换时。
当算法可能发生变化,且变化不应影响到使用算法的客户端时。

示例:FlyStrategy 是策略接口,FlyWithWings 和 FlyNoWay 是具体策略类,Duck 是上下文类,客户端通过创建不同策略的 Duck 对象来模拟不同鸭子的飞行行为

//策略接口
public interface FlyStrategy {void fly();
}
//具体策略类
public class FlyWithWings implements FlyStrategy{@Overridepublic void fly() {System.out.println("The duck is flying with its wings.");}
}
// 具体策略类
public class FlyNoWay implements FlyStrategy{@Overridepublic void fly() {System.out.println("The duck cannot fly");}
}
//上下文
public class Duck {private FlyStrategy flyStrategy;public Duck(FlyStrategy flyStrategy) {this.flyStrategy = flyStrategy;}public void performFly(){flyStrategy.fly();}
}
//客户端
public class Client {public static void main(String[] args) {Duck mallardDuck=new Duck(new FlyWithWings());mallardDuck.performFly();Duck rubberDuck=new Duck(new FlyNoWay());rubberDuck.performFly();}
}

这篇关于Java23种设计模式-行为型模式之策略模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/937537

相关文章

Spring项目的几种乱码问题解决思路

[b][color=green][size=large]与Spring结合做Web项目时,常常会出现乱码情况,这时候,问题可能出现在2方面,一方面是我们本身的应用程序,另一方面就是出现在数据库,那么针对这两种可能出现的情况应该怎么避免呢? 通常做法如下: 1,在web项目中的web.xml文件里加入文件编码过滤器UTF-8: [/size][/color][/b] <!-- 处

Spring MVC+Hibernate+Spring集成小例子

[b][color=green][size=large]上次,散仙给了一个关于Sping MVC注解简单的小例子,那么本次呢,给出一个稍微复杂的基于增加改查的小项目,下面先介绍下此项目对应的一些信息。[/size][/color][/b] [b][color=green][size=large][table] |名称|描述 |Web容器|Tomcat6.0 |IDE工具|Myeclip

Spring MVC+SimpleJdbcDaoSupport增删改查小例子

[b][color=green][size=large]散仙,上次给的例子是基于Spring MVC+JDBC的方式做的持久层,本次就来个稍微高级点的使用Spring MVC+JDBC持久模板的方式,来完成一个基于Web的增删改查的小项目,后面会给出基于MyBatics,或Hibernate,JPA方式做持久层,基于Spring MVC整合的小例子。 下面先简单介绍下开发环境: [tabl

Spring+Spring MVC+JDBC增删改查小例子

[b][color=olive][size=large]此篇文章,也是作为入门时的一个小练习例子,使用的是JDBC完成的增删改查,相对比较简单一点,只要Spirng MVC的控制器部分熟悉就可以拿下了,另外现在练手是基于xml的方式配置实体类的,增删改查是分别对应一个控制器,实际上是完全可以放在一个控制器里面实现的,像Struts一样,这个后面散仙会基于注解的方式给出例子。[/size][/col

Struts2+Hibernate+Spring之3大框架集成小例子

[b][color=green][size=large]SSH框架集成,可以说是JAVA Web开发中的一大利器,这些框架都经历了众多企业级开发的考验,散仙,今天写此篇文章的目的,第一呢,是自己好久没写过Web开发的例子,算是练练手,第二呢,也是最重要的一个目的,是为了某一个重要的人,而写的。 所以散仙尽量会以入门者的心态,来阐述整个小项目环境的搭建以及部署开发的流程,尽量让大家通俗易懂,一目明

JAVA中如何使用线程池来管理并行任务

[b][color=olive][size=large]大多数时候,我们都可以采取多线程+线程池的方式,来优化我们程序的处理效率,JAVA在JDK1.5后的并发包,提供了很多方便快捷的并发工具辅助类,来简化并发编程。 今天散仙,简单的描述下怎么使用CompletionService和Future来快捷的处理多个并行的任务。 需求如下:现在某个盘符的目录下有10个txt文件,每行一个单词

DButils+dbcp数据源+spring实现增删改查小例子

[b][color=green][size=large]本篇主要介绍DButils工具类的使用跟Spring的JDBCTemplate框架非常类似,比我们纯手写JDBC的sql语句,会方便许多,如果加上了连接池的配置,那么效果就会更加完美, 首先我们来看下DButils的简介: Common Dbutils是操作数据库的组件,对传统操作数据库的类进行二次封装,可以把结果集转化成List。它是对

Java虚拟机之JVM整理学习笔记(四)

[b][color=green][size=large]前几篇我们学习了,JVM里面的运行结构,GC算法,以及各种垃圾收集器的优劣点,那么本篇我们来看下如何使用一些虚拟机性能监控工具,来监控和快速处理故障,当JVM出现一些故障时,我们通常从如下的几个方面进行着手分析,包括运行日志,异常堆栈,GC日志,线程快照(threaddump/javacore文件),堆转储快照(heapdump/hprof文

Java虚拟机之JVM整理学习笔记(三)

[b][color=green][size=large] 一,判断对象存活算法 JVM如何判断对象可以回收了? 主要的算法有: 1,引用计数算法,当多一个地方引用此类时,引用计数加一,否则就减一,算法很简单,实现也比较简单 缺点:很难解决对象之间相互引用的问题 2,可达性分析算法,通过一系列GC Roots路径,从节点开始搜索,来判断整个引用链是否还有关系。 在java语言中,

Java虚拟机之JVM整理学习笔记(二)

[b][color=olive][size=large]上篇文章,散仙整理了关于JVM的运行时的数据区以及各个区域,本篇我们就来看下各个区域发生异常代码的实战代码,以便于大家更容易在实际应用找到感觉。[/size][/color][/b] [b][color=green][size=large] 1,JAVA堆溢出代码,需要设置JVM参数 [/size][/color][/b]