设计模式的思考(一)

一把钥匙开一把锁,或几把钥匙开一把锁。

应用模式要注意场景(要解决什么问题)!

模式是解决现在和以后的问题,并尽量不为以后制造问题!

现在的问题是不清楚干什么,以后的问题是不清楚以前是怎么干的,无法定位问题,无从插手!无法重用!

现在的问题是设法重用以前的设计,以前的东西我不要改,也不想看它的实现细节,我会用就可以了,没有的我再实现就可以了。以前的实现应该有明确的边界。

模式主要是为“以后”服务的,意味着以后可以用现在的经验,也意味着现在可以利用“以前”的经验,同时认为以前的经验是正确的和合适的

越来越觉得设计模式、架构等非常重要。这如何理解呢?

软件设计是问题驱动的。

写代码时要有意识:你写的代码是给别人用的,同时也用到别人的代码,既是客户也是用户。

计算机就是处理数据的。怎么处理数据?数据的处理首先要解决的是存储、组织问题。第一个办法是硬编码,比如计算1+2的结果,但是这有个问题:这个程序只能算1+2,能不能更通用些呢?还能计算其他的加法计算呢?比如计算2+3?计算机专家早期都是数学家,他们很自然的想到了代数:用符号来表示一个个数据。这就产生了变量这个概念,并且严格区分概念的类型(为了充分利用硬件资源)。当数据量比较大的时候,给变量取名也成了个负责的问题,数学家如何处理大数据量的呢?数组啊!所以在程序设计中又引入了数组的概念,这些实际上都是已有的概念。早期计算机主要解决数学问题,解决计算问题,,但是在技术的发展过程中,计算机学家又发现外有大量的数据是不同类型的!(比如现在处理字符、图形图像、音视频等,比数值问题多多了!)这些数据也是相互联系的,不能把他们割裂开,比如说人口统计信息(姓名,性别、年龄、住址、职业.....),这时候人们设计了结构或者说记录,将不同的相关的数据组织在一起。这些数据组织的方法是数据最基本的组织形式,还有树、链表、图等,但不管如何,都是前面几种基本形式的升华和演化。一般树、链表、图等都是以结构的形式实现的。前面的4种形式是数据组织的最基本形式。

面向过程的程序设计中有一句说法:程序=算法+数据结构。这说明了算法和数据非常重要,同时也提示了人们一个问题:数据和算法是非常重要的,为什么要把他们割裂开呢?系统越来越庞大,这种割裂人们越看越觉得刺眼:它们明明是一起的呀!在一起!在一起!这时候人们引入了对象的概念。当然还有类这个概念,但是类和对象的关系实际上就是变量类型和变量的关系一样。

一门语言是很容易学会的,但是学好可不容易。我们大部分人至少正式地学了12年汉语,但是我们都能写出优美的文章吗?汉语从小我们就开始学、开始用了。也可以说早就会汉语了,但为了更好的用好汉语,我们阅读他人的文章,从如何写一句话(造句)、到写一段话、写一篇文章,学习别人如何布局谋篇、如何修辞、如何表达。在大学的教学中,我们学了C、C++等,就像我们的幼儿时代,我们大约知道别人讲的话是什么意思,能够和他人进行沟通,但是语言技巧是没有的。系统架构、设计模式和惯用法就是我们在软件设计中的技巧,是告诉我们如何布局谋篇、如何修辞、如何表达。

什么是设计模式呢?模式描述了一个在我们周围不断发生的问题,以及该问题的解决方案的核心。我们中国人喜欢说这是套路。

不断发生很关键,我们前面的问题已经了。一个模式有4个核心要素:名称,问题,解决方案和效果。

系统架构相当于写文章中的布局谋篇:先写什么,在写什么,按时间顺序,按空间顺序。是顺叙,还是倒叙,要不要插叙呢?

设计模式相当于写段落,讲清一件事情,处理一个问题,并要照顾好前后。至于惯用法则相当于造句:用什么样的表达方式呢?修辞手法是什么呢?讲究规范。

一定要注意:研究架构、模式等主要的原因是系统规模大了,规模大了,问题就复杂了:量变引起质变!

前面的文章思考了软件架构,这篇说说设计模式。

设计模式是中等粒度的层次考虑软件设计的。不管是设计架构还是设计模式,其核心的思想都是把不变的“赶”到一起,把变化的“赶”到一起,当需求变化的时候,就只需要集中修改“变”那一部分,从而减少需要修改的范围,当需求变化时,提高软件适应性。(引用他人,这句话非常好

模式涉及拆分,排列组合,以及添加的问题。涉及到变与不变的问题,将不变的拆出来,以后再用;在变与不变之间加入“媒介”或“过渡”。

设计的时候原则:可添,少改,易重构。

目前人们把设计模式分为4类:创建模式、结构模式、行为模式以及J2EE 设计模式。

创建模型主要解决如何创建对象(对象之间可能是上下级关系,系统越复杂,越依赖于对象的复合而不是继承)。结构模解决如何定义新类(组合类和对象以获得更大的结构,对象之间可能是手拉手关系),行为型模式解决对象之间如何通讯(很多的对象如何协作也是个问题。涉及算法和对象间职责的分配,关注点从数据控制流转到对象间的联系),而J2EE 模式主要解决人机问题(软件还是给人用的,如何将数据结果展现出来呢?什么东西多了都是个麻烦事!)。至于类与类之间的问题靠继承来解决。前面3类模式在GOF中提出,共23种(五七干校十一式),J2EE 模式主要是在JAVA中用的比较多(称之为表现模式是不是更合适呢?),主要归纳了8种,这样典型模式一共31种。

要解释一下创建,结构和行为这几个概念:

创建:想象一下,你很饿,你想得到一顿晚饭,这顿饭从什么地方来?你可以自己做(你得有厨房),你可以到饭店去(外面得有饭店,并且饭店要开门),你也可以到朋友家去蹭饭(你得有朋友,并且朋友愿意给你蹭饭)。饭怎么来的?这就是创建。

结构:结构涉及到有什么以及相互之间的连接关系、位置关系等。想象一下,你要结婚了,准备盖房子。你的房子是什么样子呢?是平房还是楼房?如果是平房的话,有院子吗?准备盖几间?厨房在哪?卫生间在哪?几间朝南?几间朝北?这就是结构。结构包括系统有几个组成部分及各个部分之间的关系(三室一房一厅一卫)。一个机械系统,比如说车轮(运动系统),零件(元素、部件)有标准件和异构件,要能够把这么多的不同零件组合在一起,其中的零件,尤其是异构件,其连接(接口)一定要按按照标准来。各个部件之间的关系有多种,可以按照不同的类别划分:位置、上下级、依赖、整体与局部.....

行为:涉及到做什么事情和做事的顺序。想象一下,你饿了,要吃饭。每次吃饭前你总是要洗手,另外吃饭时你是先喝汤,后上菜,还是先上菜后喝汤?这就是行为。借用PMP中的概念,系统元素之间有四种逻辑关系:完成到开始,完成到完成,开始到开始,开始到完成,再加上提前量和滞后量。顺序也是如此。

但是要注意,这三者是有联系的:做什么事情,先做什么,后做什么(行为),与那些部门有关(结构模式),而建立什么样的部门(创建模式)也跟做什么事情有关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值