设计模式2——策略模式
策略模式
1、定义
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
2、核心
将算法的使用和算法的实现分离开来。
一个基于策略模式的程序至少由两部分组成:
第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。
第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类。要做到这点,说明Context 中要维持对某个策略对象的引用
3、优缺点
优点
可以有效地避免多重条件语句,将一系列方法封装起来也更直观,利于维护
缺点
往往策略集会比较多,我们需要事先就了解定义好所有的情况
4、实现
`
// 策略模式的设计,应用在实际生产中,表单验证算是不错的使用例子
// 1、整理错误信息
let errMsgs = {
'maxlength':'超出最大长度。',
'isNumber':'输入值仅限数字。'
}
// 2、规则集
var test = {
isNumber(value, errMsg){
if(typeof value !== 'number' || !/^\d+(.\d+)?$/.test(value)){
return errMsg || errMsgs['isNumber']
}
return true
},
maxlength(value, MAX_LENGTH, errMsg){
if(value.length > MAX_LENGTH){
return errMsg || errMsgs['maxlength']
}
return true
}
}
// 3、校验器
function Vaildator(){
this.items = {}
}
Vaildator.prototype = {
constructor : Vaildator,
//添加规则
add(rule, ...args){
this.items[rule] = args
return this
},
startTest(){
let rules = Object.keys(test)
let items = this.items
let results = []
rules.map(ruleKey=>{
let args = items[ruleKey]
if(args){
let result = test[ruleKey].apply(null, args)
results.push(result)
}
})
return results
}
}
new Vaildator().add('isNumber', 1024)
.add('maxlength', '123456789' , 3, '超过了三位。')
.startTest()
// 测试返回值为 [true, '超过了三位。']
`
本文来自博客园,作者:Math点PI,个性签名:“不写bug怎么进步?”,转载请注明原文链接:https://www.cnblogs.com/MrZhous/p/17222689.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用