设计模式-Strategy模式
目录
- 一个例子
- 传统做法
- 策略模式
- 总结
策略模式(Strategy Pattern),属于行为型模式,指的是定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。
一个例子
前一阵子忙活落户的事,发现不同人群落户的政策也不太一样,如果要写一段程序针对不同人群做不同的处理该是什么样呢。
传统做法
一般在工作中遇到这种不同情况不同处理的时候首先会想到if-else结构(当然也会有switch)。
落户处理类
public class SettleHandler {/*** 处理户口* @param crowdType 人群类型:大学生,创业者,其他*/public static void handleSettle(String crowdType) {if (CrowdTypeEnum.COLLEGESTUDENT.getCode().equals(crowdType)) {//一系列处理操作System.out.println("全国高等院校在校学生(教育部学信网在册人员),均可迁入本市落户。");} else if (CrowdTypeEnum.PIONEER.getCode().equals(crowdType)) {//一系列处理操作System.out.println("凡在我市依法注册登记并正常经营的市场主体,其法定代表人、员工和个体经营者可迁入本市落户。");} else if (CrowdTypeEnum.OTHER.getCode().equals(crowdType)) {//一系列处理操作System.out.println("详讯本地公安局");}}
}
根据人群类型选择不同的处理策略
//大学生String myCrowdType = CrowdTypeEnum.COLLEGESTUDENT.getCode();System.out.print("大学生落户政策:");SettleHandler.handleSettle(myCrowdType);//创业者String myCrowdType1 = CrowdTypeEnum.PIONEER.getCode();System.out.print("创业者落户政策:");SettleHandler.handleSettle(myCrowdType1);
大学生落户政策:全国高等院校在校学生(教育部学信网在册人员),均可迁入本市落户。
创业者落户政策:凡在我市依法注册登记并正常经营的市场主体,其法定代表人、员工和个体经营者可迁入本市落户。
可以发现上面写法的弊端:如果要增加一个人群类型,就要对应增加一个处理规则,也就是要多加一个if判断,如果规则变得很多,这将变得非常麻烦。
策略模式
策略模式核心是将算法策略独立出来以便达到易扩展的目的。
落户处理策略基类
public interface Strategy {/*** 策略处理方法*/void handle();
}
大学生落户处理策略
public class CollegeStudentStrategy implements Strategy {/*** 策略处理类**/@Overridepublic void handle() {System.out.println("全国高等院校在校学生(教育部学信网在册人员),均可迁入本市落户。");}
}
创业者落户处理策略
public class PioneerStrategy implements Strategy {/*** 策略处理方法**/@Overridepublic void handle() {System.out.println("凡在我市依法注册登记并正常经营的市场主体,其法定代表人、员工和个体经营者可迁入本市落户。");}
}
其他落户处理策略
public class OtherStrategy implements Strategy {/*** 策略处理方法**/@Overridepublic void handle() {System.out.println("详讯本地公安局。");}
}
策略处理上下文
public class StrategyContext {private Strategy strategy;public StrategyContext(Strategy strategy) {this.strategy = strategy;}public void handle() {strategy.handle();}
}
不同情况不同策略处理
//大学生落户Strategy strategy = new CollegeStudentStrategy();StrategyContext context = new StrategyContext(strategy);System.out.print("大学生落户政策:");context.handle();//创业者落户Strategy strategy1 = new PioneerStrategy();StrategyContext context1 = new StrategyContext(strategy1);System.out.print("大学生落户政策:");context1.handle();//其他落户Strategy strategy2 = new OtherStrategy();StrategyContext context2 = new StrategyContext(strategy2);System.out.print("其他落户政策:");context2.handle();
大学生落户政策:全国高等院校在校学生(教育部学信网在册人员),均可迁入本市落户。
大学生落户政策:凡在我市依法注册登记并正常经营的市场主体,其法定代表人、员工和个体经营者可迁入本市落户。
其他落户政策:详讯本地公安局。
总结
- 很明显能感觉到将算法单独拆分出来之后更容易应对后续增加不同算法的问题。
- 策略模式并不决定在何时使用何种算法。在什么情况下使用什么算法是由客户端决定的。
- 策略模式主要解决的是不同算法之间如何组织如何调度算法。
- 它遵循了多用组合,少用继承、针对接口编程,不针对实现编程两个设计原则。
当然把使用什么算法交给用户,就意味着用户必须理解这些算法的区别,才能恰当选择算法。后续可以结合工厂模式来解决这个问题。
你可以在这里获取相关代码:设计模式-Strategy模式
转载于:https://www.cnblogs.com/xuxiaojian/p/11475120.html
设计模式-Strategy模式相关推荐
- 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?
文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...
- 设计模式学习笔记——策略(Strategy)模式
设计模式学习笔记--策略(Strategy)模式 @(设计模式)[设计模式, 策略模式, Stategy] 设计模式学习笔记策略Strategy模式 基本介绍 策略案例 类图 实现代码 Hand类 S ...
- 解读设计模式----策略模式(Strategy Pattern)
一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应 ...
- 李建忠设计模式——策略模式Strategy
目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...
- 实验一:行为型设计模式之Strategy模式
实验一:行为型设计模式之Strategy模式 https://blog.csdn.net/weixin_43206161 一.实验目的 熟练使用JAVA实现行为型设计模式-策略模式,理解设计模式的模式 ...
- 乱砍设计模式之一 -- STRATEGY模式
STRATEGY模式---赵子龙单骑救主 junguo STRATEGY在中文中被译成了策略,我感觉这个意思并不妥切,但翻英文词典能得到的翻译也只有这个,我的词典比较简单,不知道是否还有其它意思?如果 ...
- 设计模式【14】——策略模式( Strategy 模式)
文章目录 前言 一.策略模式( Strategy 模式) 二.具体源码 1.Strategy.h 2.Strategy.cpp 3.Context.h 4.Context.cpp 5.main.cpp ...
- 设计模式(四)【Strategy模式】
Strategy模式 <设计模式>中的三个原则: 1.针对接口编程而不是实现 2.优先使用对象组合而不是类继承 3.考虑设计中哪些是可变的,对变化的概念进行封装. 例:国际电子商务系统案列 ...
- 设计模式-策略模式(Strategy)-Java
设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...
最新文章
- 计算机中的 marshal 是什么意思?(列集:将数据从某种格式存为流格式的操作)(序列化)(marshalling、unmarshalling散集)
- springboot配置index
- 如何抓取html请求,请求获取网页的response,获取网页的html 怎么那么慢
- new、delete与malloc、free的详解
- 计算机科学与技术探索,计算机科学与技术的发展趋势探索
- Navicat for MySQL 64位官方中文版
- 洛谷 P3397 地毯 【二维差分标记】
- pod BaiduMapKit 报错解决方案
- idea好看字体设置
- 每个星座的出生日期php,php根据出生日期计算年龄 生肖 星座程序
- Belief Propagation信念传播算法详解
- 同一服务器中,同一框架下的不同二级域名之间网站session如何互通
- 酒精传感器与单片机的衔接
- 《此生,若你安好.便是晴天》 -- @ShinePug
- 未来计算机畅想英语作文,畅想未来的生活life in the future
- 用树莓派制作视频监控器
- Linux 压缩包乱码
- onLoad onShow
- cc150:实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针
- php-beast源码加密