【知识分享】C语言中的设计模式——开篇
前言
从一个普通的码农成为架构师的第一步,就是要从代码搬运转化为有自己一套设计方法。架构设计的基石,就是要拥有一套可信手拈来的设计模式。
在之前一直认为C语言在这一块的设计思想特别稀缺,而事实也是如此。但其实想想编程语言的一个发展过程会发现,不是C语言没有人总结好的设计方法,而是大部分方法在更高级的语言里(如C++、Java)里已经被人总结了无数次。今天就来讲讲面向对象语言里的一个传世经典——设计模式。
一开始其实是被这本书名劝退的。书全名《设计模式——可利用面向对象软件的基础》。众所周知,C语言是面向过程的语言,C++、Java这种才是面向对象的语言。而且书中开篇就直接表明,书中所有设计模式跟例子,都只针对于面向对象语言,不在面向过程类的语言上做讨论。但这里我们需要有一个意识,就是面向对象或面向过程,更多指的是一种思维方式,不是说C语言就不能做一些面向对象的设计,而不是特指C语言。网上也有很多C语言面向对象的优秀例子,比如伟大的Linux内核不就是C语言开发的吗。另一本经典著作《Java编程思想》,正文也是跟Java这个编程语言搭不上边,更多讲的是一种思想。
在编程语言发展迅速的今天,C语言仍然能够占有一席之地,离不开其灵活性和可塑造性。所以我们应该打开思路,大胆参考借鉴其他语言的一些设计思路,有助于身为“C语言大佬”的我们,真正成为一个大佬。
前置能力
既然设计模式是码农到架构师的进阶之路,那么前提就是你已经成为一名合格的码农。那到什么程度才适合学习设计模式呢?首先需要满足以下两点:
1. 需求理解能力
需求是设计的灯塔,只有对需求有正确的理解,才能对其进行设计。注意哦,这里只是说需求理解,不是需求管理。因为对于需求管理,里面包含着太多太多的学问。但是对于需求的理解,则是一名程序员入门必备的技能。如果需求都无法正确理解,无法做拆分,那做出来的东西必定是偏离初衷的。就像是在建房子,无论你的设计能力有多强,设计的房子有多漂亮,但别人要求价钱建个医院,你却建成了酒店,甚至在这个地方是个违建的建筑,这让别人怎么使用。
2. 需求实现能力
充分理解了需求后,那就需要对需求进行转换,从人类可以理解的语言逻辑,转换成符合代码规则的逻辑。因为这里跟代码挂钩,所以针对不同的语言特性,这里会有不一样的转换思路。为什么这个能力很重要,那是因为本文所讲的设计模式,其实是优化需求实现的过程,如果没有一个原始的实现版本,怎么来谈优化?如果连需求怎么实现都不清楚就来讲设计,那无疑是在纸上谈兵。
其实上面提到的两个点,分别对应软件工程里的需求收集管理和详细设计,而接下来我们要讲述的设计模式,则是属于详细设计的内容,对详细设计的优化。对于软件工程的相关知识,这里就不展开讲了,后续有时间的话我们可以专门针对这个聊一聊。(你们很关心的架构设计,是属于概要设计的内容哦)
对于需求的实现,这里先提供一种基础的设计方式,也是本人最喜欢的设计分析模型——数据流。把需求的输入到实现,拆解成“输入”、“解析”、“输出”三部分,再将其中每一部分进行拆解,一直拆解到无法再往下拆分的程度,这时候就可以得到一条数据流路。
比如现在要求做一个自动浇水的机器,那么拆解的第一步,输入是土壤干,输出是浇水,中间是控制器。然后再具体一下,土壤是否干,需要有个检测土壤湿度的传感器,浇水则是需要有个可以控制出水的装置。于是输入部分可以拆解成,输入是土壤干,输出是土壤干的信号,中间是传感器。输入部分可以拆解成,输入是控制出水的信号,输出是浇水,中间是出水装置。以此类推,到最后,如果只要做中间控制器的部分,那只要实现中间这条数据链路即可。
然后有了数据流向分析的能力后,怎么跟后面要提到的设计模式扯上关系呢?这里稍等总结了一下,所有的设计模式,都要基于一个大前提,那就是对数据和逻辑的抽象归纳。以下所有设计模式都是基于抽象共性得到。根据抽象内容的不同区分出这些设计模式。因为是基于抽象共性的基础上进行的设计模式,所以设计模式只适用于设计的对象必须是存在不变部分的情况。如果设计的对象全是变化部分,那就没有设计模式什么事了。
目录链接
讲了这么多,那么接下来就来看下设计模式都有哪一些。这里根据共性对象的不同,区分了创建型、结构型和行为型,这也是书中区分的三大章节。而最后一个表驱动,则是基于C语言的设计特性出来的一个方法,不在设计模式书中提及,而是在另一本著作《代码大全》中提及。
创建型
抽象工厂
生成器
工厂方法
原型
单件
结构型
适配器
桥接
组合
装饰
外观
享元
代理
行为型
职责链
命令
解析器
迭代器
中介者
备忘录
状态模式
策略
模板方法
访问者
表驱动
相关知识
设计模式、软件工程
【知识分享】C语言中的设计模式——开篇相关推荐
- html类名定义规则_好程序员分享Java语言中的标识符规则
好程序员分享Java语言中的标识符规则,在编程过程中,经常需要在程序中定义一些符号来标记一些名称,如包名.类名.方法名.参数名.变量名等,这些符号被称为标识符.标识符可以由任意顺序的大小写字母.数字. ...
- c语言打印qword类型,c/c++开发分享c语言中数据类型BYTE,WORD和DWORD的格式说明符?...
在 例如,如果我尝试使用"%lu"显示BPB_BytsPerSec,我会得到不同寻常的数据. printf("Bytes per Sector: %lu", b ...
- 【知识分享】C语言中的设计模式——命令模式
背景 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给 ...
- 【知识分享】C语言中的设计模式——解释器
背景 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文. 名词释义 解 ...
- C++基础知识:C++语言中的表达式求值
经常可以在一些讨论组里看到下面的提问:"谁知道下面C语句给n赋什么值?" m = 1; n = m+++m++; 最近有位不相识的朋友发email给我,问为什么在某个C++系统里, ...
- 【C】C语言中的设计模式
目录 前言 1 继承.封装.多态 2 单件模式 3 外观模式 前言 偶然在网上看到C语言设计模式的文章,觉得很有用,在此开一篇连载,将自己学到的东西给大家展示下,希望对大家有用 1 继承.封装.多态 ...
- 【豆知识】C语言中转义字符“\a”是什么意思?
转义字符"\a" 在练习C语言文件流的时候,看到了书上所列举之程序的printf()函数参数里含有一转义字符"\a".此为何意?甚是好奇.然上网搜索未果,遂自行 ...
- 【知识分享】C语言应用——指针篇
一.概述 C语言基础大部分都很好理解,唯一入手门槛比较高的,就数指针了.指针是C语言的一大特色,因为指针,C语言可以极度灵活,但也因为指针,C语言变得很不安全.指针就是一把双刃剑,用好了可以让 ...
- springboot中药知识分享网站设计 毕业设计-附源码201818
摘 要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用.简单的流程.便捷可靠的支付方式.快捷畅通的物流快递.安全的信息保护都使得电子 ...
最新文章
- SQLite 作者最新开源力作
- PHP对Excel导入导出操作
- 深拷贝与浅拷贝(mutableCopy与Copy)详解 iOS
- spring boot使用logback实现多环境日志配置
- iOS内存管理的知识梳理
- ​JavaScript 开发人员的主要基本技能是?
- set,env,export,set -x,set -e;
- 海明码计算(校验码)
- PHP Encoder (ioncube 10) 加密工具的使用
- java 计算父亲节_写了一个简单的计算父亲节母亲节等日期的方法
- 华为p40pro手机计算机在哪里,一文看懂华为P40/P40 Pro差别在哪
- 小程序中轻松添加日期和时间的选择
- 微信怎么识别图片文字
- C++程序设计案例实训教程第9章
- 百变郁锦香,开创新典范,深化全球战略布局成就国际高端酒店品质之选
- 高校的论文查重系统有哪些?
- WriteFile操作时返回87错误
- html 用户名限制,js对输入用户名的限制
- 邮件to cc bcc
- 【增大C盘内存——拓展卷】C盘与未分配空间之间有恢复分区的解决方法——安装diskgenius