设计模式 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. Go 学习笔记(16)— 函数(02)[函数签名、有名函数、匿名函数、调用匿名函数、匿名函数赋值给变量、匿名函数做回调函数]
  2. 金九银十,不要跳槽!
  3. Yii中Action详解
  4. 用python画太阳花-python 简单的绘图工具turtle使用详解
  5. css命名规范和书写规范
  6. VTK:小部件之SplineWidget
  7. signature=27ba8feff228d8babc1d1762f8da4445,Embedding digital signatures into digital payloads
  8. iPhone开发-输出口和操作(转)
  9. mysql创建表时报150_Mysql创建表时报错error150
  10. 前端开发工具介绍----合成雪碧图工具(css sprite)
  11. BP算法:原理推导数据演示项目实战1(转)
  12. 2013蓝桥杯C++B:翻硬币(找规律和getline())
  13. 程序员面试金典——9.2机器人走方格
  14. Ubuntu18.04 自带桌面共享配置
  15. 国潮正当时,把优秀传统文化融入时代脉搏
  16. T1005: 地球人口承载力估计(信息学一本通C++)
  17. 【C++】struct结构体/构造函数
  18. 百度云模拟登陆批量保存Python版(一)
  19. 【计算机毕业设计】Java ssm 高校运动会管理系统(开题+源码+论文)
  20. C程序设计基础(一)

热门文章

  1. 面试之Java圣经6
  2. Win11怎么调亮度?Win11调屏幕亮度的四种方法
  3. javastudy-43:小孩报数问题
  4. LaTeX中设置字体颜色的三种方式
  5. 苹果计算机又记录吗,苹果电脑肿么看历史记录
  6. python安装skimage模块
  7. vue项目中插入icon图标
  8. 我形我速 服务器正在运行中,我形我速使用教程
  9. ☀️手把手教你用 C# 下载文件的十八般武艺☀️《❤️记得收藏❤️》
  10. java对用户名密码加密_Spring security实现对账户进行加密