设计模式 by Python1:策略模式
设计模式 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:策略模式相关推荐
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式入门(策略模式)
[0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...
- 设计模式 之美 -- 策略模式
策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换.对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户. 基本的UML类图如下: 用户使用S ...
- Java设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- 《研磨设计模式》chap17 策略模式(2) 总结
1. 新增加context 上下文类 eg. 发工资:发人民币和发美元 public interface PaymentStrategy {//公司给某人真正支付工资 public void pay( ...
- 设计模式のStrategyPattern(策略模式)----行为模式
一.问题产生背景 当我们进行一系列处理时(员工工资核算,会员管理,计算器,优惠活动),会有很多相似的算法和处理过程,只是由于具体的算法的差异,导致必须不同处理.这些处理和客户端无关,我们可以把这些算法 ...
- [设计模式] javascript 之 策略模式
策略模式说明 定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化. 说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用 ...
- LOL设计模式之「策略模式」
之前写过一篇什么是「设计模式」?,没有类图,没有代码,有些同学说看不太懂,今天给大家带来策略模式(有图,有码,有真相!). 英雄联盟(LOL) 玩过LOL的同学都知道,LOL有上百个英雄,如果用OO技 ...
- 从王者荣耀看设计模式(一.策略模式)
从王者荣耀看设计模式(策略模式) 一:简介 游戏开始前,玩家需要选择英雄,再根据所选择的阵容自由选择召唤师技能,游戏开始,玩家可以控制英雄进行普通攻击和使用召唤师技能攻击 二:策略模式 策略模式将可变 ...
- 《设计模式》之策略模式
一.什么是策略模式? 比如对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现种策略,在不同场景使用不同的实现,并且可以自由切换策略. 1.1.策略模式结构 ...
最新文章
- 笔记-中项案例题-2017年上-风险管理
- 设计模式学习笔记(1)之单例模式
- SgmlReader使用方法
- Vue之splice和push
- 微型计算机主存可以分为,计算机基础试题 (含答案)
- HGsoft-downloader
- Airbnb搜索:Embedding表示学习
- sublime php code sniffer,mac下sublime text3的php错误提示插件php code sniffer安装后,无法显示php错误...
- 公司项目NODEJS实践0.1[ ubuntu,nodejs,nginx...]
- 视频教程-VBA从入门到精通(控件+类模块+ADO+SQL数据库)-Office/WPS
- 系统辨识(一):相关概念
- Discuz网站地图在线生成
- 产品读书《AI进化论:解码人工智能商业场景与案例》
- 为什么要进行WHQL微软徽标认证?
- 算法思想理解系列 -- 检索排序学习之pairwise类型
- 系统架构师设计培训心得之二——架构设计
- 记--Python --日常练习的两种思考方法
- vue项目中高德地图根据城市名定位到城市中心位置,并在该位置做标记
- Qt5官方demo解析集34——Concentric Circles Example
- Android逆向之https,android实战项目源码