前言

从一个普通的码农成为架构师的第一步,就是要从代码搬运转化为有自己一套设计方法。架构设计的基石,就是要拥有一套可信手拈来的设计模式。

在之前一直认为C语言在这一块的设计思想特别稀缺,而事实也是如此。但其实想想编程语言的一个发展过程会发现,不是C语言没有人总结好的设计方法,而是大部分方法在更高级的语言里(如C++、Java)里已经被人总结了无数次。今天就来讲讲面向对象语言里的一个传世经典——设计模式。

一开始其实是被这本书名劝退的。书全名《设计模式——可利用面向对象软件的基础》。众所周知,C语言是面向过程的语言,C++、Java这种才是面向对象的语言。而且书中开篇就直接表明,书中所有设计模式跟例子,都只针对于面向对象语言,不在面向过程类的语言上做讨论。但这里我们需要有一个意识,就是面向对象或面向过程,更多指的是一种思维方式,不是说C语言就不能做一些面向对象的设计,而不是特指C语言。网上也有很多C语言面向对象的优秀例子,比如伟大的Linux内核不就是C语言开发的吗。另一本经典著作《Java编程思想》,正文也是跟Java这个编程语言搭不上边,更多讲的是一种思想。

在编程语言发展迅速的今天,C语言仍然能够占有一席之地,离不开其灵活性和可塑造性。所以我们应该打开思路,大胆参考借鉴其他语言的一些设计思路,有助于身为“C语言大佬”的我们,真正成为一个大佬。

前置能力

既然设计模式是码农到架构师的进阶之路,那么前提就是你已经成为一名合格的码农。那到什么程度才适合学习设计模式呢?首先需要满足以下两点:

1. 需求理解能力

需求是设计的灯塔,只有对需求有正确的理解,才能对其进行设计。注意哦,这里只是说需求理解,不是需求管理。因为对于需求管理,里面包含着太多太多的学问。但是对于需求的理解,则是一名程序员入门必备的技能。如果需求都无法正确理解,无法做拆分,那做出来的东西必定是偏离初衷的。就像是在建房子,无论你的设计能力有多强,设计的房子有多漂亮,但别人要求价钱建个医院,你却建成了酒店,甚至在这个地方是个违建的建筑,这让别人怎么使用。

2. 需求实现能力

充分理解了需求后,那就需要对需求进行转换,从人类可以理解的语言逻辑,转换成符合代码规则的逻辑。因为这里跟代码挂钩,所以针对不同的语言特性,这里会有不一样的转换思路。为什么这个能力很重要,那是因为本文所讲的设计模式,其实是优化需求实现的过程,如果没有一个原始的实现版本,怎么来谈优化?如果连需求怎么实现都不清楚就来讲设计,那无疑是在纸上谈兵。

其实上面提到的两个点,分别对应软件工程里的需求收集管理和详细设计,而接下来我们要讲述的设计模式,则是属于详细设计的内容,对详细设计的优化。对于软件工程的相关知识,这里就不展开讲了,后续有时间的话我们可以专门针对这个聊一聊。(你们很关心的架构设计,是属于概要设计的内容哦)

对于需求的实现,这里先提供一种基础的设计方式,也是本人最喜欢的设计分析模型——数据流。把需求的输入到实现,拆解成“输入”、“解析”、“输出”三部分,再将其中每一部分进行拆解,一直拆解到无法再往下拆分的程度,这时候就可以得到一条数据流路。

比如现在要求做一个自动浇水的机器,那么拆解的第一步,输入是土壤干,输出是浇水,中间是控制器。然后再具体一下,土壤是否干,需要有个检测土壤湿度的传感器,浇水则是需要有个可以控制出水的装置。于是输入部分可以拆解成,输入是土壤干,输出是土壤干的信号,中间是传感器。输入部分可以拆解成,输入是控制出水的信号,输出是浇水,中间是出水装置。以此类推,到最后,如果只要做中间控制器的部分,那只要实现中间这条数据链路即可。

然后有了数据流向分析的能力后,怎么跟后面要提到的设计模式扯上关系呢?这里稍等总结了一下,所有的设计模式,都要基于一个大前提,那就是对数据和逻辑的抽象归纳。以下所有设计模式都是基于抽象共性得到。根据抽象内容的不同区分出这些设计模式。因为是基于抽象共性的基础上进行的设计模式,所以设计模式只适用于设计的对象必须是存在不变部分的情况。如果设计的对象全是变化部分,那就没有设计模式什么事了。

目录链接

讲了这么多,那么接下来就来看下设计模式都有哪一些。这里根据共性对象的不同,区分了创建型、结构型和行为型,这也是书中区分的三大章节。而最后一个表驱动,则是基于C语言的设计特性出来的一个方法,不在设计模式书中提及,而是在另一本著作《代码大全》中提及。

创建型

抽象工厂

生成器

工厂方法

原型

单件

结构型

适配器

桥接

组合

装饰

外观

享元

代理

行为型

职责链

命令

解析器

迭代器

中介者

备忘录

状态模式

策略

模板方法

访问者

表驱动

相关知识

设计模式、软件工程

【知识分享】C语言中的设计模式——开篇相关推荐

  1. html类名定义规则_好程序员分享Java语言中的标识符规则

    好程序员分享Java语言中的标识符规则,在编程过程中,经常需要在程序中定义一些符号来标记一些名称,如包名.类名.方法名.参数名.变量名等,这些符号被称为标识符.标识符可以由任意顺序的大小写字母.数字. ...

  2. c语言打印qword类型,c/c++开发分享c语言中数据类型BYTE,WORD和DWORD的格式说明符?...

    在 例如,如果我尝试使用"%lu"显示BPB_BytsPerSec,我会得到不同寻常的数据. printf("Bytes per Sector: %lu", b ...

  3. 【知识分享】C语言中的设计模式——命令模式

    背景     命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给 ...

  4. 【知识分享】C语言中的设计模式——解释器

    背景     解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文. 名词释义     解 ...

  5. C++基础知识:C++语言中的表达式求值

    经常可以在一些讨论组里看到下面的提问:"谁知道下面C语句给n赋什么值?" m = 1; n = m+++m++; 最近有位不相识的朋友发email给我,问为什么在某个C++系统里, ...

  6. 【C】C语言中的设计模式

    目录 前言 1 继承.封装.多态 2 单件模式 3 外观模式 前言 偶然在网上看到C语言设计模式的文章,觉得很有用,在此开一篇连载,将自己学到的东西给大家展示下,希望对大家有用 1 继承.封装.多态 ...

  7. 【豆知识】C语言中转义字符“\a”是什么意思?

    转义字符"\a" 在练习C语言文件流的时候,看到了书上所列举之程序的printf()函数参数里含有一转义字符"\a".此为何意?甚是好奇.然上网搜索未果,遂自行 ...

  8. 【知识分享】C语言应用——指针篇

    一.概述     C语言基础大部分都很好理解,唯一入手门槛比较高的,就数指针了.指针是C语言的一大特色,因为指针,C语言可以极度灵活,但也因为指针,C语言变得很不安全.指针就是一把双刃剑,用好了可以让 ...

  9. springboot中药知识分享网站设计 毕业设计-附源码201818

    摘  要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用.简单的流程.便捷可靠的支付方式.快捷畅通的物流快递.安全的信息保护都使得电子 ...

最新文章

  1. SQLite 作者最新开源力作
  2. PHP对Excel导入导出操作
  3. 深拷贝与浅拷贝(mutableCopy与Copy)详解 iOS
  4. spring boot使用logback实现多环境日志配置
  5. iOS内存管理的知识梳理
  6. ​JavaScript 开发人员的主要基本技能是?
  7. set,env,export,set -x,set -e;
  8. 海明码计算(校验码)
  9. PHP Encoder (ioncube 10) 加密工具的使用
  10. java 计算父亲节_写了一个简单的计算父亲节母亲节等日期的方法
  11. 华为p40pro手机计算机在哪里,一文看懂华为P40/P40 Pro差别在哪
  12. 小程序中轻松添加日期和时间的选择
  13. 微信怎么识别图片文字
  14. C++程序设计案例实训教程第9章
  15. 百变郁锦香,开创新典范,深化全球战略布局成就国际高端酒店品质之选
  16. 高校的论文查重系统有哪些?
  17. WriteFile操作时返回87错误
  18. html 用户名限制,js对输入用户名的限制
  19. 邮件to cc bcc
  20. 【增大C盘内存——拓展卷】C盘与未分配空间之间有恢复分区的解决方法——安装diskgenius

热门文章

  1. VMware虚拟机三种网络模式:桥接模式,NAT模式,仅主机模式
  2. jQuery之标签操作和返回顶部、登录验证、全选反选、克隆示例
  3. PMP项目管理-如何区分不同的组织类型?
  4. 何为:“P类问题,NP问题,NP难问题?”
  5. Centos:Xshell 修改Nginx配置文件
  6. VR旅游,虚拟现实线上旅游优势|广州华锐互动
  7. 【渝粤教育】国家开放大学2018年春季 8617-22T燃气仪表与自动化 参考试题
  8. 【人工智能】遗传算法
  9. echarts折线图区域渐变
  10. CMDB服务器管理系统【s5day88】:采集资产-文件配置(一)