当前位置: 首页 > 后端技术 > Java

深入设计模式-策略模式

时间:2023-04-01 13:31:10 Java

1.策略模式简介2.策略模式用代码演示3.总结4.spring源码中策略模式的应用1.策略模式简介定义:策略pattern,1)definealgorithm族分别封装,以便相互转化。这种模式使得算法独立于使用该算法的客户端。2)该算法体现了几个设计原则。首先,将更改代码与未更改代码分开;第二,针对接口而不是具体的类进行编程(定义了策略接口);第三,多用途组合/聚合,少用继承。2)简单来说,我们以点需求为例(点需求真的可以应用到各种设计模式中,所以当你接到这种需求时,不要用ifelse来完成整个点需求,笔者大学刚毕业的时候,工作第二个月接到积分需求,当时是采用工厂+模板方式+策略方式实现的。)假设我们现在分为很多种完成任务奖励积分时的任务,分别有不同的奖励算法,这时候我们可以使用策略模式。2.用代码演示策略模式。我们先定义一个算法的抽象类模型:publicinterfaceIIntegralAction{//加/扣点前的检查操作,比如检查账户是否开通,检查用户是否异常,检查奖励/使用次数是否异常等.等等voidpreCheck(StringuserId);//执行具体的增减逻辑voidexecute(StringuserId);//执行post逻辑,比如更新数据时间等voidafter(StringuserId);}然后,我们可以根据奖励积分的不同算法逻辑来实现这个接口。然后定义一个抽象类来实现这个抽象接口,编写前后置逻辑,设置调用顺序。publicclassAction101implementsIIntegralAction{@OverridepublicvoidpreCheck(StringuserId){//检查逻辑}@Overridepublicvoidexecute(StringuserId){//执行逻辑}@Overridepublicvoidafter(StringuserId){//postProcess逻辑,比如更新时间}}然后写出来。3.总结策略模式是对一系列算法进行封装的方法。每个算法都有一个类。所有这些类都执行相同类型的工作,但实现方式不同。它可以以相同的方式调用所有算法。减少各种算法类和使用它们的类之间的耦合。我们可能会觉得它和之前介绍的模板方法设计模式有点相似,但不同的是,在模板方法设计模式中,定义算法步骤的主体在策略模式中的抽象父类中,而主体调用模板方法是在客户端在实际编程中,由于具体的策略实现类之间难免有一些相同的逻辑,为了避免重复的代码,我们往往使用抽象类来扮演策略的角色,将公共代码封装在它。因此,在很多应用场景中,模板方法模式的影子一般都在策略模式中看到。4.spring源码中,策略模式的应用我们知道在spring中,如果要使用容器管理对象,一般需要先定义信息,可能有xml,可能有注解,可能有json:此时,spring先将配置文件读回到容器中,但是不同的文件读取方式不同。这时候就用到了策略模式。定义一个抽象的读取方法,然后采用不同的实现。