如何从⽣活中领悟设计模式
⽂章推荐
作者简介
罗伟富,CSDN 博客专家,ABC360 客户端资深⼯程师。3 年 SDK 开发,2 年客户端开发,从底层到应⽤层积累了丰富的开发经验,熟悉 C++、Java、Python 等多种不同开发语⾔。热爱⽣活,乐于分享,善于⽤⽣活的场景解读难懂的技术。
课程介绍
设计模式(Design pattern)是⼀套被反复使⽤、多数⼈知晓的、⽆数⼯程师实践的代码设计经验的总结,它是⾯向对象思想的⾼度提炼和模板化。使⽤设计模式将会使你的代码具有更⾼的可重⽤性,更好的灵活性和可拓展性,更易被⼈阅读和理解。
我⼀直坚信:程序源于⽣活,⼜⾼于⽣活。程序的灵魂在于思维的⽅式,⽽思维的灵感来源于⽣活的精彩。本系列课程我将以全新的⽅式,从⽣活中你我的故事开始,由浅⼊深地逐步阐述设计模式的思想,并抽象出代码模型(⾻架)。 程序不应只是冷冰冰的代码,更应赋予它⽣活的乐趣和特殊的意义。
本课程将会从⽣活的⾓度,在⽣活的每⼀个细节和故事中解读⼀个个设计模式。⼒求⽤最通俗的语⾔阐述最难懂的概念;⽤最简单的语法实现最复杂的逻辑;⽤最短⼩的代码写出最强悍的程序。希望能给您带来⼀种全新的阅读体验和思考⽅式。
导读关于设计模式的思考
为什么叫设计模式
什么是设计模式
设计模式与⽣活有什么联系
为什么要学设计模式
如何进⾏学习
为什么选择 Python
弥补市场空缺
⼤势所趋,Python 已然成风
简单的 Python 基础
Python 的特点
基本语法
数据类型
常⽤容器
List(列表)
Tuple(元组)
Dictionary(字典)
类的定义
Demo 让你顿悟
重要说明
两年前 CSDN 出⼀个产品叫 ink,旨在提供⼀个⾼质量写作环境。那时就有写这⼀系列的想法了,⽽且也确实写了,就在 ink ⾥写了三篇⽂章,后来不知道因为什么原因这个产品下架了,我的三篇⽂章也没了,这事也就⼀直被我搁置下来。今天,我以全新的⽅式和思路重写这⼀系列⽂章!
我们从⽣活的⼩故事开始,由浅⼊深,逐步阐述设计模式的思想,并抽象出代码模型(⾻架)。
为什么叫设计模式
什么是设计模式
设计模式最初是被 GoF 于1995年提出的。GoF 全称是Gang of Four(四⼈帮),即 Erich Gamma,Richard Helm,Ralph Johnson 和 John Vlissides。他们四⼈于1995年出版了⼀本书 (中⽂翻译为“设计模式:可复⽤⾯向对象软件的基础”),第⼀次将设计模式提升到理论⾼度并将之规范化。该书提出了23种经典的设计模式。
设计模式(Design pattern)是⼀套被反复使⽤、多数⼈知晓的、⽆数⼯程师实践的代码设计经验的总结,它是⾯向对象思想的⾼度提炼和模板化。使⽤设计模式是为了让代码具有更⾼的可重⽤性,更好的灵活性和可拓展性,更易被⼈阅读和理解。GoF 提到模式有四个基本要素:
1. 模式名称:助记名,⽅便讨论、交流、传播;
2. 问题:该模式是⽤来解决哪类实际问题,即它的应⽤场景;
3. 解决⽅案:设计的组成部分,它们之间的相互关系及各⾃的职责和协作⽅式;
4. 效果:使⽤模式能达到的效果,即对使⽤条件的权衡取舍。
设计模式与⽣活有什么联系
我⼀直坚信:程序源于⽣活,⼜⾼于⽣活。程序的灵魂在于思维的⽅式,⽽思维的灵感来源于⽣活的精彩。互联⽹是⼀个虚拟的世界,⽽程序本⾝就是对⽣活场景的虚拟和抽象,每⼀个模式我都能在⽣活中到他的影⼦。⽐如,说到状态模式我能想到⽔有冰、⽔、⽓三种状态,⽽⼈也有少、壮、⽼三个不同的阶段;提起中介模式我能⽴马想到房产中介;看到单例模式,脑海中会即刻浮现⼼⽬中的那个她……
设计模式是⾯向对象的⾼度抽象和总结,⽽越抽象的东西越难以理解。本系列⽂章的⽬地就是为了降低设计模式的阅读门槛,以⽣活中的⼩故事开始,⽤风趣的⽅式,由浅⼊深地讲述每⼀个模式。让你再次看到设计模式不只是⼀个模式,还是⽣活中的⼀个个⼩确幸!程序不是冷冰冰的代码,它还有⽣活的乐趣和特殊意义。
为什么要学设计模式
设计模式是软件开发⼈员在软件开发过程中⾯临的⼀般问题的解决⽅案。这些解决⽅案是众多软件开发⼈员经过相当长的⼀段时间试验和错误总结出来的。所以不管你是新⼿还是⽼⼿,学习设计模式对你都有莫⼤的帮助。
学习设计模式的理由有很多,我这⾥只列出⼏个最现实的:
1. 摆脱⾯试的窘境,不管你是前端⼯程师还是后端⼯程师,亦或是全端⼯程师,设计模式都是不少⾯试官必问⼀道题。
2. 让你的程序设计能⼒有⼀个质的提升,不再是写⼀堆结构复杂,难以维护的烂代码。
3. 使你对⾯向对象的思想有⼀个更⾼层次的理解。
如何进⾏学习
熟悉⼀门⾯向对象语⾔
⾸先,你⾄少要熟悉⼀门⾯向对象的计算机语⾔。如果没有,请根据⾃⼰学习、爱好,或希望从事的⼯作,先选择⼀门⾯向对象语⾔
(C++,Java,Python,Go 等都可以)进⾏学习和实战,对抽象、继承、多态、封装有⼀定的基础之后,再来看本系列的⽂章。
了解 Python 的基本语法
对 Python 基本语法有⼀个简单了解。Python 语法⾮常简单,只要你有⼀定的编程语⾔基础,通过下⽂的介绍很快就能理解的。
学会阅读 UML 图
UML(Unified Modeling Language)称为统⼀建模语⾔或标准建模语⾔,是⾯向对象软件的标准化建模语⾔。UML 规范⽤来描述建模的概念有:类(对象的)、对象、关联、职责、⾏为、接⼝、⽤例、包、顺序、协作以及状态。
UML 类图表⽰不同的实体(⼈、事物和数据)如何彼此相关;换句话说,它显⽰了系统的静态结构。想进⼀步了解类图中的各种关系,可参考以下⽂章: UML 类图关系⼤全)
阅读本系列⽂章
通过阅读本系列⽂章,以轻松愉快的⽅式学习设计模式和编程思想。本系列⽂章每⼀章都是单独成⽂,可从任意⼀篇⽂章开始。
为什么选择 Python
虽然说设计模式与编程语⾔没有关系,它是对⾯向对象思想的灵活应⽤和⾼度概括,你可以⽤任何⼀种语⾔来实现它,但总归是需要⽤⼀种语⾔进⾏举例的。本系列⽂章的所有⽰例代码均使⽤ Python 编写,为什么选择 Python,主要基于以下两个原因。
弥补市场空缺
设计模式于1995年被 GoF 提出,被⼴泛应⽤于热门的⾯对象语⾔。⽬前⽤ Java、C++ 描述的设计模式的书籍和资料已经⾮常多了,但⽤ Python 来描述的真是太少了。我在当当上搜索了⼀下“Python 设计模式”,只有那零星的⼏本书。⽽作为已经挤进 Top4 的 Python 语⾔,这明显是不够的。Python 已经越来越成熟,也越来越多地被使⽤,作为⼀个有技术追求的 IT ⼈有必要了解⼀下基于 Python 代码设计。
⼤势所趋,Python 已然成风
C 语⾔诞⽣于1972年,确随着 Unix 的诞⽣才深深植根于各⼤操作系统;
C++ 诞⽣于1983年,确因微软的可视化桌⾯操作系统才得以⼴泛传播;
Java 诞⽣于1995年,确因互联⽹的迅速崛起才变得家喻户晓;
Python 诞⽣于1991年,⽽下⼀场技术⾰命已然开始,AI 时代已然成风。在 AI 领域中已经被⼴泛使⽤的 Python 必将成为下⼀个时代的第⼀开发语⾔!
最热门的 AI 开源框架 PyTorch 和 TensorFlow 都已经采⽤了 Python 作为接⼝和开发语⾔。除此之外,还有⼀堆 AI 相关的框架库,也都纷纷采⽤,如 AIMA、pyDatalog、SimpleAI、PyBrain、PyML 等。
作为这么⼀门有前途的语⾔,必然是要去学习和使⽤的。
简单的 Python 基础
(这⼀部分内容,如果你已经熟悉 Python,可直接跳过。)
Python 的特点
Python 崇尚优美、清晰、简单,是⼀个优秀并⼴泛使⽤的语⾔。
与 Java 和 C++ 这些语⾔相⽐,Python 最⼤的两个特点是:
1. 语句结束不⽤分号“;”。
2. 代码块⽤缩进来控制,⽽不⽤⼤括号“{}”。
刚转过来的时候可能会有点不适,⽤⼀段时间就好了!
个⼈觉得,在所有的⾼级计算机语⾔中,Python 是最接近⼈类⾃然语⾔的。Python 的语法、风格都与英⽂的书写习惯⾮常接近,Python 的这种风格被称为 Pythonic。如条件表达式,在 Java 和 C++ 中是这样的:
⽽ Python 是这样的:
有没有觉得第⼆种⽅式更接近⼈类的⾃然思维?
基本语法
数据类型
Python 是⼀种弱类型的语⾔,变量的定义不需要在前⾯加类型说明, ⽽且不同类型之间可以⽅便地相互转换。Python 有五个标准的数据类型:int min = x < y ? x : y
1min = x if x < y else y
1
1. Numbers(数字)
2. String(字符串)
3. List(列表)
4. Tuple(元组)
5. Dictionary(字典)
其中 List,Tuple,Dictionary 为容器,将在下⼀部分介绍。Python ⽀持四种不同的数字类型:int(有符号整型)、long(长整型)、float(浮点型)、complex(复数)。
每个变量在使⽤前都必须赋值,变量赋值以后该变量才会被创建。
Demo:
结果:
常⽤容器
List(列表)
List(列表)是 Python 中使⽤最频繁的数据类型,⽤ [ ] 标识。
1. 列表可以完成⼤多数集合类的数据结构实现。类似于 Java 中的 ArrayList,C++ 中的 Vector。此外,⼀个 List 中还可以同时包含
不同类型的数据,⽀持字符、数字、字符串,甚⾄可以包含列表(即嵌套)。
2. 列表中值的切割也可以⽤到变量 [头下标:尾下标] ,就可以截取相应的列表,从左到右索引默认 0 开始,从右到左索引默认 -1 开始,
下标可以为空表⽰取到头或尾。
加号(+)是列表连接运算符,星号(*)是重复操作。
Demo:age = 18 # int weight = 62.51 # float name = "Tony" # string print ("age:", age)print ("weight:", weight)print ("name:", name)# 变量的类型可以直接改变age = name print ("age:", age)a = b = c = 5# a,b,c 三个变量指向相同的内存空间,具有相同的值print ("a:", a, "b:", b, "c:", c)print ("id(a):", id(a), "id(b):", id(b), "id(c):", id(c))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
age: 18weight: 62.51name: Tony age: Tony a: 5 b: 5 c: 5id(a): 1457772400 id(b): 1457772400 id(c): 14577724001
2
3
4
5
6
结果:
Tuple(元组)
Tuple(元组)是另⼀个数据类型,元组⽤“()”标识,内部元素⽤逗号隔开。元组不能⼆次赋值,相当于只读列表,⽤法与 List 类似。Tuple 相当于 Java 中的 final 数组,C++ 中的 const 数组。
Demo:
结果:
Dictionary(字典)是 python 中除列表以外最灵活的内置数据结构类型。字典⽤”{ }”标识,字典由索引(key)和它对应的值 value 组成。相当于 Java 和 C++ 中的 Map。
列表是有序的对象集合,字典是⽆序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,⽽不是通过偏移存取。Demo:list = ['Thomson', 78, 12.58, 'Sunny', 180.2]tinylist = [123, 'Tony']print (list ) # 输出完整列表print (list [0]) # 输出列表的第⼀个元素print (list [1:3]) # 输出第⼆个⾄第三个元素print (list [2:]) # 输出从第三个开始⾄列表末尾的所有元素print (tinylist * 2) # 输出列表两次print (list + tinylist) # 打印组合的列表list [1] = 100 # 修改第⼆个元素的值print (list ) # 输出完整列表list .append("added data")print (list ) # 输出增加后的列表12
3
4
5
6
7
8
9
10
11
12
['Thomson', 78, 12.58, 'Sunny', 180.2]Thomson [78, 12.58][12.58, 'Sunny', 180.2][123, 'Tony', 123, 'Tony']['Thomson', 78, 12.58, 'Sunny', 180.2, 123, 'Tony']['Thomson', 100, 12.58, 'Sunny', 180.2]['Thomson', 100, 12.58, 'Sunny', 180.2, 'added data']
1
2
3
4
5
6
7
8tuple = ('Thomson', 78, 12.58, 'Sunny', 180.2)tinytuple = (123, 'Tony')print (tuple) # 输出完整元组print (tuple[0]) # 输出元组的第⼀个元素print (tuple[1:3]) # 输出第⼆个⾄第三个的元素print (tuple[2:]) # 输出从第三个开始⾄列表末尾的所有元素print (tinytuple * 2) # 输出元组两次print (tuple + tinytuple)# 打印组合的元组# tuple[1] = 100 # 不能修改元组内的元素
1
2
3
4
java调用python模型5
6
7
8
9
('Thomson', 78, 12.58, 'Sunny', 180.2)Thomson (78, 12.58)(12.58, 'Sunny', 180.2)(123, 'Tony', 123, 'Tony')('Thomson', 78, 12.58, 'Sunny', 180.2, 123, 'Tony')Dictionary (字典)1
2
3
4
5
6
7
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论