杂谈设计模式与系统阶段的关系

我们经常碰到一个问题:母亲和老婆掉到水里,你先救哪个?这个问题很难回答,我们从GOF设计模式与系统的角度来解剖这个问题。 GOF设计模式分三种类型:结构型、创建型和行为型,这三者类型其实对应着一个系统的三个阶段:设计阶段、创建阶段和运行阶段。 结构型模式指出如何设计出系统的结构,也就是一个系统的孕育,如同人的十月怀胎过程。 创建型模式指出系统起初如何被创建,也就是宇宙大爆炸前一刻,是系统从纸上落地,如同人的出生和养育,是从无到有的创建过程。 行为型模式是针对系统创建后进入自我运行阶段,这时再也无需创建者和设计者干预,如同人的成年结婚生子。也就是宇宙形成后的运行状态。 下面进入具体论证一下: (1)结构型模式有Facade Proxy 桥模式 适配器Adapter和组合模式等等,这些模式共同点是针对代码结构如何设计,比如适配器模式是设计出一个适配类,能够将原来两个不匹配的类能够和谐统一,结构上可能有三个类,一般结构关系可以使用UML的类图表达;组合模式更是一种代码结构组合,将两个类组合在一起;这是一种组成结构的关系。 有结构就有关系,这也是关系数据库为什么能表达结构一样,设计表结构Schema实际是设计结构关系。 在建筑领域,土木结构的设计需要精确的设计阶段,建筑绘图就是一种结构或架构设计,它类似我们的结构型模式。 (2)创建型模式有工厂模式等,创建模式指出一个系统从设计图纸到落地运行如何创建的过程,正如一个建筑从图纸到落成需要经过施工创建过程一样。工厂模式指出专门有一个工厂类负责类的创建。 (3)行为型模式有Command 职责链 观察者等模式,这些模式都是针对系统进入自运行阶段时,系统内部如何运行的,比如Command模式是指从客户端发出请求打包成一个命令,由后端根据命令指派相应的模块响应处理。而职责链类似于过滤器,可以对请求命令进行一个个过滤拦截;观察者模式则是对运行时的状态改变的及时响应,发展为后来的Reactor模式或异步模式,因为异步编程是针对系统运行阶段的编程,编码时需要联想到系统运行的状态,这对于没有系统运行经验的程序员比较难,一般程序员比较适合顺序编程,顺序编程是一种结构编程,那么现在我们提供一些框架能让顺序编程的代码在运行时异步运行,这些都是在认识到系统不同阶段的边界后才有的发展。 因此,认识到一个系统有不同的逻辑边界对于我们认识世界更加重要,系统的结构设计、创建阶段和运行阶段是三个严格不同的逻辑世界,如同天上 人间和地狱三界不同一样。 有了系统边界认识,对于解答本文开始的问题就非常容易,母亲和老婆掉水救哪个?母亲是创建养育自己,而老婆是自己成年后进入自运行生活阶段的重点,母亲属于创建者,是创建阶段的重点,而老婆是运行阶段的重点,将这两个重点跨域边界比较显然是不符合逻辑的,提这个问题的人没有系统逻辑分界。 再比如:老板大还是公司规章制度大?老板确实是公司制度的制定者,实际属于创建阶段的老大,但是制度一旦颁布,进入运行阶段,老板自己也要服从制度管理,这时是制度大。 还有一个经济学问题,经济中重要两个角色,一个商品需要生产者和消费者,那么生产者重要还是消费者重要呢?过去计划经济时期,我们抓生产,结果经济还是没有抓上去,国营的一个个生产厂家都倒闭了,其实还是没有从系统阶段边界来认识这个问题,生产者属于经济系统创建阶段的老大,只有大量建立生产工厂,才能创建出各种商品;但是当经济进入自运行阶段后,供大于求,经济还是会崩溃,这时消费者就是老大了,只有消费才是驱动经济的关键,这也是凯恩斯等经济理论的核心基础,也就是为什么西方国家鼓励贷款提前消费的逻辑基础。 扯了这么多咸蛋,主要是想说明,其实设计模式不只是对于编程有作用,而且对于自己的三观也有帮助,因为开发者开发出一个软件系统,麻雀虽小,五脏俱全,其基本原理不亚于上帝创造世界。如果一个程序员只知道数据结构和算法,却对一个系统的设计 创建和运行等阶段没有基本逻辑认识,那么很显然会迷失在细节中失去方向。 从老子有无哲学观点看:数据结构算法和功能属于“有”,看得见摸得着;而系统阶段边界属于“无”,虽然无形无态,但是自然之道是无生有,我们不能因为首先学习了有形的知识,却忽视了无形的思想。

原文发布于微信公众号 - Linyb极客之路(gh_c420b2cf6b47)

原文发表时间:2018-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

为什么MongoDB敢说“做以前你从未能做的事”

30270
来自专栏Java技术栈

春节好消息 | Dubbo拥抱Apache,MongoDB支持事物……

大年初五好,一个年过了好些天了,软件方面都有哪些重大更新呢?我们一起来看看吧。 1.Dubbo通过投票正式进入Apache基金会孵化器 2018年2月9日,Ap...

36980
来自专栏Golang语言社区

HTML5对APP开发最终用户的三大优势

一、大幅降低使用门槛   为什么流媒体会替代下载视频成为主流?为什么页游会如此火爆?只因用户太“懒”。让用户更方便的满足需求,有时效果好于更多的满足需求。  用...

38860
来自专栏华章科技

密码又泄露?大数据告诉你什么样的密码最牢靠!

乌云漏洞报告平台近日宣布网易邮箱数据泄露,目前网易与乌云的撕逼大战虽然还没有一个确切的结果,但已让亿万邮箱用户惊出一身冷汗,也顺带反思自己的邮箱密码是否够牢靠。...

8720
来自专栏程序员互动联盟

如何成为一个黑客?

很多人要成为高大上的黑客需要学习哪些基本功? 能盗取账号,能攻击服务器? 再牛的黑客起码是一个合格的程序员 所以说想成为黑客先成为合格的程序再说,说别的就是空谈...

53670
来自专栏IT派

Node.js与PHP对战:一场关于开发者喜好的史诗级战役

整个故事正如好莱坞大片的经典剧情走向:两位昔日好友如今分道扬镳,甚至被迫陷入了你死我活的斗争当中。刚开始的分歧并不严重,无非是一位老友对于另一位伙伴长久以来占据...

13700
来自专栏程序员互动联盟

【程序人生】糟糕的程序员你会做?

一个好程序员不好做,那么一个糟糕的程序应该不难吧! 秘籍一:让你看不懂我写的是什么 都说让人看不懂的代码,才是牛逼代码。一类是算法高深,一般人实在是看不懂。另一...

33280
来自专栏老九学堂

点击续命|程序员如何有效处理bug?

测试员因bug而生 程序员因bug狗带 在程序员的职业生涯中,免不了要跟bug一直打交道 Bug也是程序员进阶的磨刀石 当然,bug还更大部分程序员的噩梦啊 ?...

40150
来自专栏程序员互动联盟

【专业技术】PHP对战Node.js

整个故事正如好莱坞大片的经典剧情走向:两位昔日好友如今分道扬镳,甚至被迫陷入了你死我活的斗争当中。刚开始的分歧并不严重,无非是一位老友对于另一位伙伴长久以来占据...

38250
来自专栏FreeBuf

从5月11号网易被攻击谈起:新型DDoS攻击LFA

5月11日晚上9时许,网易的大量用户发现访问网易新闻出现问题,相应的,有很多游戏用户报告说游戏掉线严重。一时间,有关“网易大楼着火”的谣传甚嚣。晚上9点42分的...

30960

扫码关注云+社区

领取腾讯云代金券