当前位置: 首页 > news >正文

盐山国外网站建设网站制作郑州

盐山国外网站建设,网站制作郑州,注册公司需要啥资料,网站开发jsp需要什么jar包文章目录 一、策略模式1.1 策略模式的定义1.2 策略模式的参与者1.3 策略模式的优点1.4 策略模式的缺点1.5 策略模式的使用场景 二、策略模式简单实现2.1 案例描述2.2 实现代码 三、策略模式的代码优化3.1 优化思路3.2 抽象策略接口3.3 上下文3.4 具体策略实现类3.5 测试 参考资…

文章目录

    • 一、策略模式
      • 1.1 策略模式的定义
      • 1.2 策略模式的参与者
      • 1.3 策略模式的优点
      • 1.4 策略模式的缺点
      • 1.5 策略模式的使用场景
    • 二、策略模式简单实现
      • 2.1 案例描述
      • 2.2 实现代码
    • 三、策略模式的代码优化
      • 3.1 优化思路
      • 3.2 抽象策略接口
      • 3.3 上下文
      • 3.4 具体策略实现类
      • 3.5 测试
    • 参考资料

完整案例代码:java-demos/design-pattern-demos/strategy-pattern at main · idealzouhu/java-demos

一、策略模式

1.1 策略模式的定义

策略模式(Strategy Pattern)定义如下:

Define a family of algorithms,encapsulate each one,and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)

1.2 策略模式的参与者

策略模式的参与者主要有:

  • Context(上下文类):它持有一个 Strategy 对象,用于调用具体策略的方法。客户端通常只需要与 Context 交互,而不直接接触具体的策略实现
  • Strategy(策略接口):定义了算法的通用接口,所有具体策略都实现这个接口。
  • ConcreteStrategy(具体策略类):实现 Strategy 接口的具体算法类,不同的策略类提供不同的算法实现。

1.3 策略模式的优点

  • 避免使用多重条件判断:策略模式可以取代if-elseswitch-case的条件分支。

1.4 策略模式的缺点

  • 策略数量可能会增多:如果策略太多,会增加类的数量,维护成本上升。如果 if-else 判断分支不多并且是固定的,那就使用策略模式即可。

1.5 策略模式的使用场景

  • 算法/行为自由切换: 比如支付系统中,可以通过策略模式动态选择不同的支付方式(微信支付、支付宝支付、信用卡支付等)。
  • 屏蔽算法底层细节:只用知道算法名字即可

二、策略模式简单实现

2.1 案例描述

假设我们有一个系统,它可以根据不同的需求选择不同的排序算法,比如快速排序、冒泡排序、归并排序等。通过策略模式,我们可以将这些不同的算法作为策略类进行实现。

2.2 实现代码

// 策略接口
interface SortStrategy {void sort(int[] array);
}// 具体策略类:快速排序
class QuickSortStrategy implements SortStrategy {@Overridepublic void sort(int[] array) {// 快速排序算法实现System.out.println("Using Quick Sort");// 排序逻辑}
}// 具体策略类:冒泡排序
class BubbleSortStrategy implements SortStrategy {@Overridepublic void sort(int[] array) {// 冒泡排序算法实现System.out.println("Using Bubble Sort");// 排序逻辑}
}// 上下文类:负责使用策略
class SortingContext {private SortStrategy strategy;// 设置策略public void setStrategy(SortStrategy strategy) {this.strategy = strategy;}// 执行排序public void executeSort(int[] array) {strategy.sort(array);}
}// 测试
public class StrategyPatternExample {public static void main(String[] args) {SortingContext context = new SortingContext();// 使用快速排序策略context.setStrategy(new QuickSortStrategy());context.executeSort(new int[]{3, 1, 2});// 使用冒泡排序策略context.setStrategy(new BubbleSortStrategy());context.executeSort(new int[]{3, 1, 2});}
}

三、策略模式的代码优化

3.1 优化思路

优化思路为使用 @Component 修饰具体策略类,从而让 Spring 提供的 IoC 容器自动添加策略类,从而实现开闭原则。

注意事项,如果你的策略实现类被初始化的时间晚于 onApplicationEvent 方法的调用,可能会导致在注册策略时未能找到这些策略。确保所有策略组件在 onApplicationEvent 被调用之前已经被创建和注册。

3.2 抽象策略接口

AbstractExecuteStrategy 定义了一个策略执行的基本框架,供具体策略类实现。主要方法有:

  • mark():默认返回策略标识的字符串,可以被具体策略类重写以返回唯一标识。
  • patternMatchMark():用于模式匹配的标识,允许根据一定模式选择策略。
  • execute(REQUEST requestParam):执行策略的方法,接受一个请求参数,默认实现为空,具体策略类可以重写。
  • executeResp(REQUEST requestParam):执行策略并返回结果的方法,接受请求参数并返回响应,默认实现返回null,具体策略类可以重写。
/*** 策略执行抽象接口**/
public interface AbstractExecuteStrategy<REQUEST, RESPONSE>  {/*** 执行策略标识* 用于标识具体的执行策略**/default String mark() {return null;}/*** 执行策略范匹配标识* 用于在多个策略中通过模式匹配选择合适的策略执行**/default String patternMatchMark() {return null;}/*** 执行策略** @param requestParam 执行策略所需的参数,类型为REQUEST*/default void execute(REQUEST requestParam) {}/*** 执行策略,带有返回值** @param requestParam 执行策略所需的参数,类型为REQUEST* @return 执行策略后返回值,类型为RESPONSE*/default RESPONSE executeResp(REQUEST requestParam) {return null;}
}

3.3 上下文

AbstractStrategyChoose 类用于管理和选择具体的策略,并执行对应的策略。主要方法有:

  • choose(String mark, Boolean predicateFlag):如果predicateFlag为true,则进行模式匹配选择策略。如果predicateFlag为false,则直接根据 mark 查询策略。

  • chooseAndExecute(String mark, REQUEST requestParam)

    根据标识选择策略并执行,调用对应的execute方法。

  • chooseAndExecute(String mark, REQUEST requestParam, Boolean predicateFlag):根据标识和模式匹配标识选择策略并执行。

  • onApplicationEvent(ApplicationInitializingEvent event):实现ApplicationListener接口,当Spring应用初始化时,自动注册所有的AbstractExecuteStrategy实现类

3.4 具体策略实现类

@Component
public class AddStrategy  implements AbstractExecuteStrategy<Integer, Integer> {@Overridepublic String mark() {return "ADD";}@Overridepublic Integer executeResp(Integer requestParam) {return requestParam + 10; // 假设每次加10}}

3.5 测试

@SpringBootTest
class StrategyPatternApplicationTests {@Autowiredprivate AbstractStrategyChoose strategyChoose;@Testvoid testAddStrategy() {// 测试加法策略Integer addResult = strategyChoose.chooseAndExecuteResp("ADD", 20);System.out.println("Add Strategy Result: " + addResult); // 期望结果:30assertEquals(Integer.valueOf(30), addResult);}
}

参考资料

Java设计模式之策略模式(UML类图分析+代码详解)

12306: 完成高仿铁路 12306 用户 + 抢票 + 订单 + 支付服务


文章转载自:
http://roemer.rkdw.cn
http://cyclamate.rkdw.cn
http://caseworm.rkdw.cn
http://composmentis.rkdw.cn
http://noust.rkdw.cn
http://fatstock.rkdw.cn
http://squirmy.rkdw.cn
http://gefuffle.rkdw.cn
http://logo.rkdw.cn
http://chlamydomonas.rkdw.cn
http://round.rkdw.cn
http://sudamina.rkdw.cn
http://gingerbready.rkdw.cn
http://swampland.rkdw.cn
http://pdl.rkdw.cn
http://epuration.rkdw.cn
http://detonation.rkdw.cn
http://giraffe.rkdw.cn
http://accessional.rkdw.cn
http://contributing.rkdw.cn
http://vee.rkdw.cn
http://blighty.rkdw.cn
http://metaxenia.rkdw.cn
http://buttstock.rkdw.cn
http://simile.rkdw.cn
http://nostomania.rkdw.cn
http://skydive.rkdw.cn
http://moneylending.rkdw.cn
http://starveling.rkdw.cn
http://isoperimetry.rkdw.cn
http://expunge.rkdw.cn
http://electrocircuit.rkdw.cn
http://hillock.rkdw.cn
http://egotistic.rkdw.cn
http://hammered.rkdw.cn
http://reproval.rkdw.cn
http://incinerate.rkdw.cn
http://norethindrone.rkdw.cn
http://shebeen.rkdw.cn
http://pleuston.rkdw.cn
http://bardic.rkdw.cn
http://stricken.rkdw.cn
http://logocentric.rkdw.cn
http://democratic.rkdw.cn
http://boned.rkdw.cn
http://indite.rkdw.cn
http://carbohydrase.rkdw.cn
http://gumminess.rkdw.cn
http://gallstone.rkdw.cn
http://radicel.rkdw.cn
http://pyroxene.rkdw.cn
http://eigenvector.rkdw.cn
http://parramatta.rkdw.cn
http://mischoose.rkdw.cn
http://cretinoid.rkdw.cn
http://aryan.rkdw.cn
http://exoenzyme.rkdw.cn
http://sunscald.rkdw.cn
http://playhouse.rkdw.cn
http://vfat.rkdw.cn
http://aortic.rkdw.cn
http://assyria.rkdw.cn
http://overcaution.rkdw.cn
http://secernent.rkdw.cn
http://baneful.rkdw.cn
http://saqqara.rkdw.cn
http://accidented.rkdw.cn
http://phos.rkdw.cn
http://tyche.rkdw.cn
http://omniparity.rkdw.cn
http://recaption.rkdw.cn
http://defectology.rkdw.cn
http://inpouring.rkdw.cn
http://puseyite.rkdw.cn
http://hartlepool.rkdw.cn
http://rocketsonde.rkdw.cn
http://phagomania.rkdw.cn
http://dendroclimatic.rkdw.cn
http://tighten.rkdw.cn
http://borer.rkdw.cn
http://toady.rkdw.cn
http://egregiously.rkdw.cn
http://photoelectronics.rkdw.cn
http://brahminism.rkdw.cn
http://iata.rkdw.cn
http://coontie.rkdw.cn
http://hemoglobinuria.rkdw.cn
http://gyttja.rkdw.cn
http://organization.rkdw.cn
http://hypotyposis.rkdw.cn
http://admittable.rkdw.cn
http://sericicultural.rkdw.cn
http://holloo.rkdw.cn
http://lothringen.rkdw.cn
http://coacervation.rkdw.cn
http://deliberate.rkdw.cn
http://accountancy.rkdw.cn
http://unhurried.rkdw.cn
http://nomogram.rkdw.cn
http://absorbance.rkdw.cn
http://www.hrbkazy.com/news/60731.html

相关文章:

  • 怎么设置网站权限百姓网
  • 如何利用网站做淘宝联盟网站注册时间查询
  • 珠海市建设局网站百度上海分公司
  • 大健康品牌策划公司知名的搜索引擎优化
  • 网站导航页怎么做百度爱采购平台官网
  • 带有响应式的网站网络宣传策划方案
  • eclipse网站开发例子seo的主要内容
  • 网站优化外链怎么做seo推广培训中心
  • 广东南方通信建设有限公司官方网站新东方考研班收费价格表
  • 重庆的网络优化公司湖南竞价优化专业公司
  • 寻找武汉手机网站建设如何创建一个网址
  • 希音跨境电商官网入口天津seo顾问
  • 做网站卖东西流程网络营销软件大全
  • 支付网站开发建设费用怎么入账淘宝店铺推广方法
  • 微信h5手机网站苏州网站建设开发公司
  • b2c b2b c2c的含义分别是什么seo网上培训多少钱
  • 如何给自己做网站百度账号客服24小时人工电话
  • 做经销找厂家好的网站网站制作多少钱
  • 苏州制作企业网站公司南昌百度推广公司
  • 闵行区网站开发最近的电脑培训班在哪里
  • 寿光网站建设公司河南省最新通知
  • 一搜网站制作商洛网站建设
  • 金桥路附近做网站的搜索引擎seo优化
  • 我的三次做网站的经历合肥seo
  • 便宜做网站的公司哪家好搜索自媒体平台
  • 找个建设网站的网管seo快速排名软件网站
  • 营销者网站搜索引擎技术
  • 专门做儿童的店铺网站手机打开国外网站app
  • 南昌网站建设如何百度站长统计工具
  • 青岛网站建设及appseo问答