最新要闻
- 一季度新接船舶订单量同比增53%(新数据 新看点) 环球看热讯
- Win10再见!微软确认22H2为终极正式版 系统不再更新:2025年结束支持
- 价保618!真我GT Neo5降了:1TB版卖3299元 世界快报
- 比Wi-Fi 6快4倍!华为首测Wi-Fi 7:真机网速狂飙4.3Gbps 当前热门
- 全球快看:越来越黑化!《变形金刚1-7》女主角颜值变化 网友叹息黑人赢麻了
- 天风证券:4月第3周新能源汽车订单明显改善,车展有望带动终端需求回升
- 天天热文:北大校训是什么(北京大学的校训是什么)
- 新一轮国内油价今日调整 有望下调0.11元/升!中石油:油价过低不好 世界关注
- 世界热头条丨同事结婚行政到工位挨个收礼金被吐槽 还不请吃饭:网友热议别强迫
- 世界快看点丨史诗级升级!曝iPhone 15 Pro支持雷电3
- 当前速递!文移民合同范本(推荐4篇)
- 分享无人回应 爸爸退了家庭群:媒体点评称这是最起码尊重_每日信息
- 超越美国 我国核电机组2030年将达世界第一:第四代核电已有探索
- 内地引进!《变形金刚7:超能勇士崛起》正式预告发布:宇宙大帝来袭 焦点简讯
- 世界关注:国外品牌光环不再 你敢信车展排队半小时是为了看国产车?
- 7nm不让用!飞腾腾云5000C CPU公布:80核心变64核心 性能大大缩水_天天速递
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天热讯:【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
【资料图】
简介
策略模式(Strategy Pattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。
当你想使用对象中各种不同的算法变体,使用if...else 所带来的复杂和难以维护,可使用策略模式。或者当有许多相同类,它们仅在执行某些行为时略有不同,可使用策略模式。
作用
- 策略算法可以自由切换,保持策略与执行类的松耦合。
- 避免使用多重条件判断,不同环境角色可以组装多个策略。
- 扩展性良好,可以随时增删策略行为。
- 体现了多用组合,少用继承。
实现步骤
- 建立一个策略接口。
- 新建多个策略行为类,实现该策略接口。
- 建立一个抽象环境角色类,并将策略接口组合进来。是否需要抽象类可选。
- 建立多个环境角色类来继承该抽象类。
- 可以动态改变环境角色的策略行为。
不同语言设计模式源码下载:
https://github.com/microwind/design-pattern
UML
Java代码
状态基础接口
// Strategy.java 基础策略接口public interface Strategy { public void run();}
策略实现类
// StrategyA.java 策略Apublic class StrategyA implements Strategy { @Override public void run() { System.out.println("StrategyA::run()."); }}
// StrategyB.java 策略Bpublic class StrategyB implements Strategy { @Override public void run() { System.out.println("StrategyB::run()."); }}
// StrategyC.java 策略Cpublic class StrategyC implements Strategy { @Override public void run() { System.out.println("StrategyC::run()."); }}
抽象业务类
// Context.java 抽象业务类,聚合策略对象public abstract class Context { protected Strategy strategy; public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void action() { this.strategy.run(); }}
具体业务类
// ContextCat.java 业务类构造器聚合了某策略public class ContextCat extends Context { public ContextCat() { // 使用某个策略 System.out.println("ContextCat::setStrategy(StrategyC)."); this.setStrategy(new StrategyC()); }}
// ContextDog.java 业务类构造器聚合了某策略public class ContextDog extends Context { public ContextDog() { // 使用某个策略 System.out.println("ContextDog::setStrategy(StrategyB)."); this.setStrategy(new StrategyB()); }}
测试调用
/** * 策略模式就是根据需要给对象绑定具体策略,使得具体实现和策略可以灵活搭配。 * 先声明某个具体Context对象,该对象已经绑定了具体策略,同时还可以更改策略。 */ // 实例化某个内容,策略已经绑定上 Context contextCat = new ContextCat(); contextCat.action(); // 重新设置策略 System.out.println("reset contextCat"strategy to StrategyA."); contextCat.setStrategy(new StrategyA()); contextCat.action(); // 实例化某个内容,策略已经绑定上 Context contextGog = new ContextDog(); contextGog.action();
Go代码
状态基础接口
// Strategy.go 基础策略接口// 定义一个策略接口,注意go语言数据类型即接口type Strategy interface { Run()}// 写在接口文件的其他全局方法func Init() { fmt.Println("strategy init!")}
策略实现类
// StrategyA.go 策略Atype StrategyA struct {}// 实现策略接口的对应方法func (s *StrategyA) Run() { fmt.Println("StrategyA::Run")}
// StrategyB.go 策略Btype StrategyB struct {}// 实现策略接口的对应方法func (s *StrategyB) Run() { fmt.Println("StrategyB::Run")}
// StrategyC.go 策略Ctype StrategyC struct {}// 实现策略接口的对应方法func (s *StrategyC) Run() { fmt.Println("StrategyC::Run")}
抽象业务类
// Context.go 抽象业务类,聚合策略对象type Context struct { strategy Strategy}// 设置不同strategy,方法名首字母大写func (c *Context) SetStrategy(s Strategy) { c.strategy = s}// 执行策略接口里面的方法func (c *Context) Run() { c.strategy.Run()}
具体业务类
// ContextCat.go 业务类构造器聚合了某策略// 定义具体执行对象,Go没有继承,用聚合来调用Context里的函数type ContextCat struct { context Context}// 可提前绑定具体的策略func (c *ContextCat) Init() { c.context.SetStrategy(&StrategyC{}) fmt.Println("ContextCat::init. setStrategy(StrategyC)")}// 调用策略方法func (c *ContextCat) Run() { fmt.Println("ContextCat::run") c.context.Run()}
// ContextDog.go 业务类构造器聚合了某策略type ContextDog struct { context Context}// 可提前绑定具体的策略func (c *ContextDog) Init() { c.context.SetStrategy(&StrategyB{}) fmt.Println("ContextDog::init. setStrategy(StrategyB)")}// 调用策略方法func (c *ContextDog) Run() { fmt.Println("ContextDog::run") c.context.Run()}
测试调用
func main() { fmt.Println("test start:") // 这里src.Init来自strategy.go文件 src.Init() /** * 策略模式就是根据需要给对象绑定具体策略,使得具体实现和策略可以灵活搭配。 * 先声明某个具体Context对象,该对象已经绑定了具体策略,同时还可以更改策略。 */ // 声明策略执行对象 context := src.Context{} // 设置策略A context.SetStrategy(&src.StrategyA{}) // 执行策略A,打印StrategyA context.Run() // 设置策略B context.SetStrategy(&src.StrategyB{}) // 执行策略B,打印StrategyB context.Run() // 执行策略C,打印StrategyC context.SetStrategy(&src.StrategyC{}) context.Run() // /*********************** 分割线 ******************************************/ // 直接实例化具体执行对象,策略已经绑定 contextCat := src.ContextCat{} contextCat.Init() contextCat.Run() // 直接实例化具体执行对象,策略已经绑定 contextDog := src.ContextDog{} contextDog.Init() contextDog.Run()}
更多语言版本
不同语言设计模式源码:https://github.com/microwind/design-pattern
关键词:
-
每日聚焦:Docker获取Let`s Encrypt SSL 证书
文中的操作都是在CentOSStreamrelease9下执行的,使用的是root用户。1 安装docker 卸载原有的dockeryumremovedockerdocker-c
来源: -
天天热讯:【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
简介策略模式(StrategyPattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需
来源: 每日聚焦:Docker获取Let`s Encrypt SSL 证书
天天热讯:【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
一季度新接船舶订单量同比增53%(新数据 新看点) 环球看热讯
Win10再见!微软确认22H2为终极正式版 系统不再更新:2025年结束支持
价保618!真我GT Neo5降了:1TB版卖3299元 世界快报
比Wi-Fi 6快4倍!华为首测Wi-Fi 7:真机网速狂飙4.3Gbps 当前热门
全球快看:越来越黑化!《变形金刚1-7》女主角颜值变化 网友叹息黑人赢麻了
天风证券:4月第3周新能源汽车订单明显改善,车展有望带动终端需求回升
“欧佩克+”减产倒计时 中国能源供给如何摆脱新变数|环球今亮点
天天热文:北大校训是什么(北京大学的校训是什么)
新一轮国内油价今日调整 有望下调0.11元/升!中石油:油价过低不好 世界关注
世界热头条丨同事结婚行政到工位挨个收礼金被吐槽 还不请吃饭:网友热议别强迫
世界快看点丨史诗级升级!曝iPhone 15 Pro支持雷电3
世界热议:学系统集成项目管理工程师(中项)系列13b_人力资源管理(下)
当前速递!文移民合同范本(推荐4篇)
分享无人回应 爸爸退了家庭群:媒体点评称这是最起码尊重_每日信息
pandas 常见函数的使用 环球速讯
全球微动态丨[MoeCTF 2021]地狱通讯
《飞链云真实AI模特解决方案》
超越美国 我国核电机组2030年将达世界第一:第四代核电已有探索
内地引进!《变形金刚7:超能勇士崛起》正式预告发布:宇宙大帝来袭 焦点简讯
世界关注:国外品牌光环不再 你敢信车展排队半小时是为了看国产车?
7nm不让用!飞腾腾云5000C CPU公布:80核心变64核心 性能大大缩水_天天速递
锐龙7000多次烧毁 AMD闪电锁定“凶手”!果然猜对了
确山警方:一村(格)一警走访入户 筑牢安全防范根基 世界要闻
directx9.0c是什么软件 directx是什么软件_焦点关注
全球观天下!“逃离东北”的东北医生,多家医院因报名不足缩减岗位
2023国内外毫米波雷达行研分析 全球快播报
全球看热讯:前三月卖了55.2万辆车 比亚迪一季度营收破1200亿
每日播报!健身博主自曝因压力长六颗子宫肌瘤 专家:子宫肌瘤“偏爱”这3种人
《美猴王》发布剧照被吐槽丑 大圣更像大马猴:周星驰就这水平?
2023国内外毫米波雷达行研分析|天天速递
长沙雨花区坚持以稳定促发展 倾力为民解忧
腾讯代理!《无畏契约》国服5月2日开放下载:核显都能玩
快播:新能源汽车卖疯了 比亚迪一季度利润大涨410%:问鼎全球销冠
史上最大!苹果开发14寸新iPad:操作系统前所未有|全球今日报
太拼!春假首日孩子们在高铁上刷卷子:杭州小学生还要霸占北京景点
旅美大熊猫“乐乐”死因报告发布:心脏病变可能是主因
世界快报:热门中概股美股盘前涨跌不一,有道跌超6%
oop第二次作业 环球新要闻
Java中的Lambda详细解读
Linux再学!_全球简讯
10 如何表示虚拟内存
焦点快播:lua元表、元方法
世界即时看!知识产权保护为“中国制造”保驾护航 助力企业“走出去”
AI生成《原子之心》冰箱姐姐:身材超火辣!-全球快看点
天天观热点:AMD Zen4+RDNA3加持最强掌机!ROG Ally价格泄露:性能堪比PS5
《王国之泪》大量实机截图:菜谱来了!还有抽奖玩法-天天快报
全球首批机器受精试管婴儿出生:用PS5手柄操控机器人受精
OPPO第一季度销量登顶!用户点赞:售后非常好
武功县气象台发布大风蓝色预警【Ⅳ级/一般】【2023-04-27】
每日动态!nginx出现504错误的原因分析及解决
商品日报(4月27日):宏观面担忧加剧 原油系集体重挫|精彩看点
买皮肤也能“分期”了:《英雄联盟》加入点券分期付款功能
【世界报资讯】一次购买喝到爽!冻颜密码椰汁临期大促:9.9元/大瓶超值
雷军微博调研!米粉选出最喜欢的手机:小米13 Ultra排第二
每日消息!国产武侠《侠乂行》获支持:Intel发布4335显卡驱动
全球微资讯!中国空间站还能扩展:180吨级六舱合体、还可商业旅游
生存整个夜晚什么时候出 公测上线时间预告
全球焦点!REITs市场价格承压 长期投资价值回归
债市日报:4月27日_消息
好玩的奇迹mu手游有哪些 十大好玩的奇迹mu手游推荐
环球快消息!你的外卖“从天而降” 美团外卖无人机正式运行:15分钟内送达
环球即时看!日本又一核电站发生冷却水泄漏 电力公司回应:不会对外界有影响
专家呼吁企业增加带薪年假 称比调休更重要:5天太少
搭载卫星通信的手机盘点!它们都“捅破天”了:用一次续一升 前沿热点
焦点快报!1099元 微星推出G27C4X曲面屏:250Hz电竞高刷
当前快报:华为全屋智能重磅亮相AWE,以全空间、全场景、黑科技“打开空间之门”
led的点亮和流水灯的制作
pta第四次到第六次题目集_全球新资讯
记录-有意思的气泡 Loading 效果-世界微头条
Gitblit在Windows服务器下搭建及使用_微头条
当前观察:接单日记(二)SMTP发送邮件
今年就业形势稳中有升 前3个月城镇新增就业297万人|世界看点
高铁车票买到了吗?五一预计发送旅客1.2亿人次:远超2019|世界讯息
玩家吐槽腾讯《全境封锁2》太肝:不充钱能肝到死!|全球快看点
世界聚焦:当贝X5激光投影仪视频评测:2450CVIA高亮度够震撼 可媲美OLED电视
全球热讯:好价速囤:特仑苏纯牛奶2.9元/盒发车(商超6元)
丰田bZ4X即将“解除封印”!OTA后一天可快充4次:直接翻倍
真空休眠科技+嵌入式 海信真空璀璨503新品冰箱首发-视焦点讯
进程
Python数据类型|全球报资讯
环球热点!记一次峰回路转的注入
linux基本命令
这8个摸鱼神器,千万别让你老板知道!
童心筑梦工匠精神
五一假期未到游客已至 杭州小学生要霸占北京景点了:错峰出行_观热点
颠覆减肥界!摄入型食欲控制胶囊问世:可治疗胃肠道疾病|今日热议
便宜1万块!小米电视大师86英寸Mini LED对比索尼旗舰 画质无限接近
天天滚动:阔别20年终于回家了!旅美大熊猫“丫丫”专机已降落上海
圆形模组设计瞩目!真我11系列上架预约:超越影像旗舰
年报看复苏| 2022年上市房企减员超10万人,仍有房企薪资上涨 专家:今年情况会有所改善 世界速讯
火山引擎 DataLeap 下 Notebook 系列文章三:架构升级详解 世界热文
RPM常用命令以及组合使用场景 全球热闻
存款利率下调,提前还贷和投资黄金是好的选择吗?
【新华500】新华500指数(989001)27日收涨0.68%-通讯
2023KPL春季赛总决赛将于5月13日在杭州电竞中心举办 通讯
即时:男子考科目一作弊 竟在假发内藏“黑科技”设备
世界消息!3天内3死2伤!印度一矿工下班路上遭雷击身亡
手游也有FSR、DLSS了 高通推出骁龙GSR:游戏秒变4K、性能翻倍 世界速读