主页 > 模式 >

【实战】计划形式使用之政策形式

浏览1574 好评 0 点赞105

  

【实战】计划形式使用之政策形式

  

【实战】计划形式使用之政策形式

  

【实战】计划形式使用之政策形式

  

【实战】计划形式使用之政策形式

  ThemeManager类的构造函数中绑定了主窗体中的SetTheme方法,也就是我上面贴出的第一段代码,并在ChangeFormTheme执行的时候调用。到此为止,这一块的功能大致上就OK啦,但是细心的你可能会发现,如果我又添加了一个配色方案怎么办?由上面的代码段可以看出,需要再添加一个枚举和一个Switch语句分支,问题就出在这里!!!如果要添加10个怎么办?20个呢?难道要一直修改Switch语句?很明显,这违背了OCP原则,即对扩展开放,对修改关闭的原则。这时该我们的策略模式上场了,下面是我重构以后的代码:

  然后建立一个维护Travel的上下文,这里应用了单例模式产生TravelContext类,并包含了SetTravel方法用于设置Travel策略,以及Travel方法用于执行策略。代码如下:

  下面还是从一个生活中的小例子入手,解释一下策略模式的大概用法,深入浅出地理解这个常用的设计模式。

  再建立一个维护Theme的上下文,包含一个ITheme接口的引用和一个SetTheme方法,SetTheme方法中调用实现了ITheme接口的类的SetTheme方法。

  在我之前的一篇博文XSmartNote里,有这样的一个功能,就是切换应用的配色方案,当我选择不同的配色方案时,会执行Switch语句中相应的方案来达到修改配色方案的目的。下面用代码来解释这个过程:

  以上只是一个简单的例子,没有什么实际的意义,也不是很切题,那为什么还要写出来?只是让我们对策略模式的构成以及应用场景有一个大概的认识,下面我会根据代码重构的经历来说说策略模式在具体应用程序中的应用。

  建立好上下文后,开始建立具体的策略方案,本例中就是几种Travel的方式,不管以哪种方式执行策略,我们都是在旅行,所以每种策略都实现ITravel接口,并具体实现ITravel接口下的Travel方法,代码如下:

  那么什么时候才会去调用这两个方法以实现配色方案的变更呢?当然是点击切换主题的时候,代码如下:

  这样就完成了繁杂的Switch语句向策略模式的华丽转身,如果想看到具体的代码,请在GitHub上查看。最后放上简单的效果图:

  策略模式的用意是针对一组算法或逻辑,将每一个算法或逻辑封装到具有共同接口的独立的类中,从而使得它们之间可以相互替换。策略模式使得算法或逻辑可以在不影响到客户端的情况下发生变化。说到策略模式就不得不提及OCP(Open Closed Principle) 开闭原则,即对扩展开放,对修改关闭。策略模式的出现很好地诠释了开闭原则,有效地减少了分支语句。

  上述代码中的两个方法SetThemeColor和SetTextAndBarColor是设置配色方案的主要代码,传入的参数就是Color,然后这两个方法就会变更自己负责的部分的配色方案。下面是具体实现代码:

  以上就是上次重构XSmartNote的过程,经过自己的思考和总结并实际运用到自己的小项目中,收获还是很大的,至少理解了策略模式在什么时候可以派上用场以及这种模式所解决的问题。可是有人会问,在客户端调用的时候,还是会new一个具体的对象啊,这样就会产生依赖,是的,这就是注入依赖要解决的问题咯,本文不做深入的探讨。如果文中有什么表述不当的地方,还请大家提出,谢谢大家,另外本文会同步发布到我的简书。

  关于设计模式的文章,园子里实在是太多太多,而且讲解的也非常精彩,那为什么我还要在这里记录下这篇文章?本文以实际项目应用“自己动手写工具--XSmartNote”为切入点,来讲述策略模式的应用。很多初学者都有一种感觉,就是在看设计模式相关文章的时候,都看得懂,而且小Demo也是手到擒来,但是就是不知道该怎么用在实际的项目中,不管你之前有没有过这种感觉,反正我是曾经有过。在前几天Review Code的时候发现XSmartNote中的主题管理功能很适合这种模式,于是就把这块相关的代码重构了一下。在此做一下记录,一来方便自己,二来惠及他人。

  下面再看看客户端是如何使用的。前两行是之前的调用方式,已经被注释掉了,最重要的是Switch语句不见了!!!

  假设老板有一天突然对办公室所有的程序员说,“给你们20天假期,去海南玩吧,经费从我这出!”,这时候办公室躁动了,哈哈,大家开始商量着怎么去海南,毕竟我们还在帝都呀,毕竟我还没有去过海南呀,大家七嘴八舌地出起主意来,有人说坐灰机,也有人说坐动车转海路... ...好了,上面只是一个业务场景,不要想太多了。那怎么实现呢?直接上策略模式,代码如下:

  如果我想再添加一个主题配色方案该怎么办?很简单,添加一个类继承自ITheme并在客户端调用就好咯,代码如下:

  上述代码中有一个ThemeManager类负责维护配色方案的功能,接收一个枚举ThemeEnum来确定要使用哪种配色方案,为了看得更方便,我把ThemeManager类的部分代码也放在这:

本站文章于2019-11-07 04:07,互联网采集,如有侵权请发邮件联系我们,我们在第一时间删除。 转载请注明:【实战】计划形式使用之政策形式
已点赞:105 +1

上一篇:

下一篇:



关于我们

  • 关于我们
  • 品牌介绍
  • 诚聘英才
  • 联系我们

学生/家长

  • 帮我选学校
  • 帮我选专业
  • 投诉/建议

教育机构

  • 如何合作
  • 联系方式

其他

  • 投稿合作
  • 权利声明
  • 法律声明
  • 隐私条款
全国统一客服电话
4006-023-900
周一至周六 09:00-17:00 接听
IT培训联盟官方公众号
扫描访问手机版
家电维修|北京赛车pk10