设计模式 by Python1:策略模式

最近开始重新看《Head First 设计模式》,作为一个不错的练习,打算在整理设计模式笔记的时候用Python实现。

作为第一个介绍的设计模式,策略模式简单的同时相当实用。

在这里,我不打算采用书中的鸭子作为例子,我决定使用我喜欢的军事题材来描述,我们不做鸭子,造航母!

航母游戏

我们现在考虑如何做一个航母游戏,就相当于航母版的战舰世界吧,这里只有一类船:航空母舰。

我们考虑一下,航母最重要的共能无疑是起降战机,目前世界上的现代航母,无非采用以下几种方式起降:

  • 弹射起飞阻拦着舰,比如美帝的尼米兹系列。
  • 滑跃起飞阻拦着舰,比如我们的辽宁舰。
  • 垂直起飞垂直着舰,比如阿三的几艘。
  • 滑跃起飞垂直着舰,不错,这么奇葩的只有我大嘤帝国。

其中起飞模式有三种,着舰模式有两种。

凡是学过OOP的,第一直觉肯定是构建一个这样的类图:

这很容易想到,但是,这样做没有任何代码复用,我们需要在每个子类中分别实现起飞和着舰的内容,现在我们只是创建了四个子类,如果要加入日本、意大利、泰国之类的小航母,那无疑是场灾难。

代码复用的基石是将可可变且可复用的部分进行剥离和封装

这也是非常实用的一种设计模式准则。

如我们之前讨论的,起飞和降落都是有数的几种模式,那我们是不是可以将这些起飞、降落模式从具体的航母上剥离?

如果你是Java程序员,那肯定会想到接口。不错,我们可以通过接口将这几种起降模式进行剥离和封装。

可能这个类图并不怎么美观,不过我已经尽了最大努力。

我们可以从类图上看到,我们已经把降落和起飞逻辑从航母具体实现中剥离,分别使用两组类来实现,然后再通过组合到航母基类的方式来使用这些起、降落模式。

我们现在用Python来具体实现。

代码有点多,这里就不一一展示了,工程文件直接上传到百度云:

链接:https://pan.baidu.com/s/1sGrKywSRwYEhbVr5fKg68w
提取码:1c4b
复制这段内容后打开百度网盘手机App,操作更方便哦

我们现在运行一下:

辽宁舰
进行滑跃起飞
进行阻拦着舰
尼米兹级
进行弹射起飞
进行阻拦着舰
伊丽莎白女王号
进行滑跃起飞
进行垂直降落着舰
维克拉马蒂亚号
进行垂直起飞
进行垂直降落着舰

可以看到不同类型的航母都按自己的方式起飞和着舰,而且无论新增哪个国家的哪艘航母,我们都可以按照已经构建的飞行和着舰模式进行快速构建。

而且这样做还有额外的好处,比如我们如果需要对辽宁号进行改造,安装弹射器,将起飞模式改为弹射起飞,我们只需要这样做:

在基类中加入改变起飞模式的方法:

    def setTakeoffMode(self, takeoffMode):self._takeoffMode=takeoffMode

然后修改主程序:

lnCarrier = LiaoNingCarrier()
print(lnCarrier)
from takeoff_pkg.catapult_takeoff import CatapultTakeoff
lnCarrier.setTakeoffMode(CatapultTakeoff())
lnCarrier.takeoff()
lnCarrier.land()

我们只需要更换辽宁号的起飞模式就能轻松实现。

总结一下,我们刚才进行的一系列OOP封装使用的就是一种设计模式,称为策略模式。

策略模式

顾名思义,策略模式指的是将一系列相似的策略封装为一组类,以起到复用的效果。

这里有三个关键的设计模式准则:

  • 抽取可变的部分进行封装。
  • 多用组合,少用继承。
  • 针对接口编程,而非实现。

这三点其实是互相关联的,比如我们如果要把一组类中的可复用部分进行封装,可以选择的手段只有继承和组合。而继承是一种很笨重的方式,一来它和子类紧密结合,而且随着继承层级的增加继承树就会很复杂,基类和各级别子类之间的重写继承关系就很难维护和处理。而组合就相当灵活,还可以随时替换。

而为了实现组合,那必然会用到接口或者抽象基类,针对组合这个场景来说,我们其实并不需要关心具体是用接口实现还是抽象基类,其本质都是利用你他们的多态特性持有相应的句柄,以进行多态调用。

而正是因为采用了接口编程的方式,我们才能把具体的策略实现和拥有策略的类松耦合。正是这样才能实现策略的复用和相应带来的灵活性。

不得不说用Python进行面向对象编程还是挺累的,这很不Python。

设计模式 by Python1:策略模式相关推荐

  1. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  2. 设计模式入门(策略模式)

    [0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...

  3. 设计模式 之美 -- 策略模式

    策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换.对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户. 基本的UML类图如下: 用户使用S ...

  4. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  5. 《研磨设计模式》chap17 策略模式(2) 总结

    1. 新增加context 上下文类 eg. 发工资:发人民币和发美元 public interface PaymentStrategy {//公司给某人真正支付工资 public void pay( ...

  6. 设计模式のStrategyPattern(策略模式)----行为模式

    一.问题产生背景 当我们进行一系列处理时(员工工资核算,会员管理,计算器,优惠活动),会有很多相似的算法和处理过程,只是由于具体的算法的差异,导致必须不同处理.这些处理和客户端无关,我们可以把这些算法 ...

  7. [设计模式] javascript 之 策略模式

    策略模式说明 定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化. 说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用 ...

  8. LOL设计模式之「策略模式」

    之前写过一篇什么是「设计模式」?,没有类图,没有代码,有些同学说看不太懂,今天给大家带来策略模式(有图,有码,有真相!). 英雄联盟(LOL) 玩过LOL的同学都知道,LOL有上百个英雄,如果用OO技 ...

  9. 从王者荣耀看设计模式(一.策略模式)

    从王者荣耀看设计模式(策略模式) 一:简介 游戏开始前,玩家需要选择英雄,再根据所选择的阵容自由选择召唤师技能,游戏开始,玩家可以控制英雄进行普通攻击和使用召唤师技能攻击 二:策略模式 策略模式将可变 ...

  10. 《设计模式》之策略模式

    一.什么是策略模式? 比如对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现种策略,在不同场景使用不同的实现,并且可以自由切换策略. 1.1.策略模式结构 ...

最新文章

  1. 笔记-中项案例题-2017年上-风险管理
  2. 设计模式学习笔记(1)之单例模式
  3. SgmlReader使用方法
  4. Vue之splice和push
  5. 微型计算机主存可以分为,计算机基础试题 (含答案)
  6. HGsoft-downloader
  7. Airbnb搜索:Embedding表示学习
  8. sublime php code sniffer,mac下sublime text3的php错误提示插件php code sniffer安装后,无法显示php错误...
  9. 公司项目NODEJS实践0.1[ ubuntu,nodejs,nginx...]
  10. 视频教程-VBA从入门到精通(控件+类模块+ADO+SQL数据库)-Office/WPS
  11. 系统辨识(一):相关概念
  12. Discuz网站地图在线生成
  13. 产品读书《AI进化论:解码人工智能商业场景与案例》
  14. 为什么要进行WHQL微软徽标认证?
  15. 算法思想理解系列 -- 检索排序学习之pairwise类型
  16. 系统架构师设计培训心得之二——架构设计
  17. 记--Python --日常练习的两种思考方法
  18. vue项目中高德地图根据城市名定位到城市中心位置,并在该位置做标记
  19. Qt5官方demo解析集34——Concentric Circles Example
  20. Android逆向之https,android实战项目源码

热门文章

  1. 121_z轴平移【transform: translateZ(n)】
  2. 正则表达式匹配中文,英文字母和数字及_的写法!
  3. 零基础可以学的vue(1)
  4. RGB、YUV和YCbCr
  5. 如何清理上网后使用过的痕迹
  6. MSDN的系统服务列表(XP2003) 【目前最全的吧。。】
  7. 【Oracle实战经验一】:OracleSpatial自定义空间参考
  8. redisson分布式锁,实战
  9. 【厦门大学】考研初试复试资料分享
  10. 2017年,毫无作为的感想篇