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