策略模式定义了算法簇,分别封装起来,让它们之间可以互相替代,此模式让算法的变化独立于使用算法的用户。

喜欢三国演义的朋友,都对诸葛亮这个神一般的军师赞誉有加。虽然事实上,除了出师表上刻画的鞠躬尽瘁死而后已的形象,小诸的计谋远没有那么的高深莫测,他更大程度上是一个政治家。

扯远了,在三国演义中,有这样一段情节: 

刘备利用周瑜、曹仁厮杀之际,乘虚袭取了南郡、荆州、襄阳,以后又征服了长沙等四郡。周瑜想想十分气恨,正无处报复以夺还荆州。不久,刘备忽然丧偶,周瑜计上心来,对孙权说:“您的妹妹,美丽、刚强,我们以联姻抗曹名义向刘备招亲,把他骗来南徐幽禁,逼他们拿荆州来换。”孙权大喜,郎派人到荆州说亲。

刘备认为这是骗局,想要拒绝,诸葛亮笑道:“送个好妻子上门何不答应?您只管去东吴,我叫赵云陪您去,自有安排,包您得了夫人又不失荆州。”接着,诸葛亮暗暗关照赵云道:“我这里有三个锦囊,内藏三条妙计。到南徐时打开第一个,到年底时打开第二个,危急无路时打开第三个……”

在不同的场景下打开不同的锦囊,便能化险为夷,锦囊便是抽象策略,具体的锦囊里面的计策便是具体的策略角色,场景就是赵云,变化的处境选择具体的策略条件。

三个关键词:抽象策略、具体策略、环境角色,三者构成了我们今天要讲解决的重点——策略模式。

C++较C语言最大的变化,就是从面向过程转而为面向对象。面向过程那套东西,就是什么时候该做什么事情,一步一步井然有序。面向对象很干脆,整个的实现封装好,用到的时候直接调用。面向过程中,我们很喜欢用
if else
来进行判断,毕竟是三大结构(顺序、选择、循环)之一。显然,一旦要业务发生变化,就得修改很多东西,这恰恰是程序猿维护时候不愿意面对的,他们更多的是喜欢扩展——
开闭原则。

如果我说,策略模式能取代if else, 你会不会惊叹的喊出:やだ!事实上,这是可以实现的。前方高能,请擦亮你的眼睛。

我们定义了Enum类ShowType表示要展示的广告类型,然后各种类型的Controller就是对应的策略类
Map<ShowType, Object> controllerMap = new HashMap();
controllerMap.put(ShowType.Banner, createBannerProperties(activity, slotId,
viewGroup, platforms); ...
我们定义一个ShowType为key值,Controller为value值的HashMap,然后将对应的key-value放进去。
原先我们是根据传进来的ShowType返回对应的Controller:
Object controller = null; switch (showType) { case Banner: properties =
createBannerProperties(activity, slotId, viewGroup, platforms); controller =
((BannerProperties) properties).getController();break; case Feed: properties =
createFeedProperties(activity, slotId, platforms); controller =
((MMUFeedProperties) properties).getController();break; case Insert: properties
= createInsertProperties(activity, slotId, platforms); controller =
((InsertProperties) properties).getController();break; case LoopImage:
properties = createLoopImageProperties(activity, slotId, viewGroup, platforms);
break; case Welcome: properties = createWelcomeProperties(activity, slotId,
viewGroup, platforms); controller = ((WelcomeProperties)
properties).getController();break; default: break; }
上面是我们原先的实现,现在有了这个HashMap后,代码可以这样修改:
Controller controller = creatorMap.get(type);
数据结构中有个关联容器:map,把类型理解为key,策略就是value的话,你会知道策略模式的执行效率较之if else,是有多么的厉害了。

更多C++示例代码,请移步到本人的github。

设计模式,祝愿你把代码写成艺术。

6/9/2017 11:41:34 AM

技术
©2019-2020 Toolsou All rights reserved,
Django个人博客搭建教程---时间分类归档你不知道的鸿蒙——HarmonyOS记录一次游戏私服getshell过程mysql联合索引详解百度网盘偷偷更新,终于实现免费不限速了! 全球第一免费开源ERP Odoo Ubuntu最佳开发环境独家首发分享uniapp页面传值总结Android中获取当前正在显示的Activity实例SQL Server 数据库词汇表Python垃圾回收与内存泄露