设计模式简述



设计模式简述

这几天从箱底翻到《设计模式》这本书,还很新,哈哈。以前只是随手翻翻,并不放在心上,现在回个头看看,很多模式还是很陌生,但我肯定以前看过,也保证那个时候是理解的,但现在还是不清楚,为什么呢?没有翻译成自己的语言是尔。所以今天就趁着手被刀切,不上班的空闲,来整理一下。

 

什么是设计模式

回答什么这个问题的时候,角度是很多的,包括设计模式的起源啊、背景啊、概念啊、结构元素啊、边界啊、在整个开发中的地位啊等等。我这里只简单说说概念,因为文章标题就是简述嘛。我这里为什么要说这么多回答what的角度呢,而不直接就说概念了事呢? 是想告诉大家一个简单的道理:就是分而治之的思想。这个在软件设计、开发中用到的也比较多,比如说快速排序就是用的这个思想。但是这里我更要说的是,先分而后治。考虑事情也一样,要先把各个角度分清楚后,再对每个角度仔细研究,而不是想到一点,就猛扎进去。只有这样做,你的大局观就会培养起来,不会以偏盖全,并且对事物都有自己的看法,而且独到。

闲话扯了这么多,现在言回正传。首先回答什么叫模式,这个定义特别好:模式描述了我们周围不断重复发生的问题以及该问题的解决办法的核心,这样就可以一次又一次利用该解决办法而不用重复劳动。按这个说话,我们对模式其实很熟悉,并且从小就会使用。比如说,小学的时候,老师教我们写记叙文,要注意几点:时间、地点、人物、事件的起因、事件的经过和结果,按照这个模子写就是一个结构完整的记叙文。所以说,模式不可怕,人人都会。

至于设计模式,它的对象不再是写记叙文,而是在软件设计中所涉及到类和对象。所以设计模式的概念就是:用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。对于这个概念,我很无语,只能感叹自己理解力差,看不明白啊。所以套用之前模式的定义就是:设计模式描述了类和对象设计中遇到的问题以及该问题的解决办法的核心,这样就可以一次又一次利用该解决办法而不用重复劳动。这样是不是清楚一点了?如果还不清楚,可以在看完具体设计模式之后,再回过头来理解。

为什么需要设计模式

         回答为什么这个问题,需要搞清楚设计模式满足了哪些人的什么需求。换句话说,这里涉及到两个基本问题:

1、   设计模式有什么作用或者好处。

2、   这些好处是用户所需要的。

很多时候,人们更看重第1条,而忽略了第2条。最近看孙中山的《三民主义》里面提到一个例子,就是自由民主思想刚传入中国的时候,很多人到处呼喊,说外国的自由民主好啊,我们要学啊,但是老百姓都置若罔闻,为什么啊?因为老百姓不需要这个,至少不是迫切需要,如果你跟他说去哪发财,他立马卷铺盖和你一起走。当然,我不是5毛啊,和这个扯不上,现在人们温饱基本解决了,才会关注分配不公啊,国进民退啊,自由和民主才越来越为人民大众所需要了。

设计模式客户群都有谁呢,主要还是我们一线的软件开发、设计人员。为什么需要,。我想大家比我有话语权,我就不班门弄斧拉,如果你不需要,我说了也没用,就象我说房子是刚需,你就是不买,我也没办法一样。

设计模式的好处有很多,涉及整个类和对象设计过程,核心就是复用和支持变化,具体的我也不想说,但总的好处还是定义上说的:提供问题解决的指导,避免重复劳动。

怎么使用设计模式

使用设计模式前,首先需要学习和理解各种具体设计模式,这就是这篇文章的初衷。文本涉及的具体设计模式就是常说的“GOF设计模式”,有23个。学习和理解之后,就是实践。当遇到类似问题的时候,就可以参考具体设计模式的结构和代码实例来设计。在实践中纠正以前的错误认识、加深对具体设计模式的理解,比如:使用它的好处、坏处、其他的可替代方法等等。至于具体设计模式的结构和代码实例可以在《设计模式――可复用面向对象软件的基础》这本书中找到。

        

 

具体的设计模式

23个具体的设计模式,在一篇文章里如果每部分都说,那这篇文章,也够长的,可以成书了,所以我们只是简单讲讲,初识一下。并且利用前面说到的先分后治思想,来分的清楚。

创建型(5个):

为什么有创建型设计模式呢,其实是基于创建独立于执行的思想。因为动作创建和执行所需要的支持是不一样的。对于动作创建,我们可能更关心它的意义。对于动作执行,我们可能更关心它的行为。

至于创建型,我们该怎么分呢?最简单的分法就是:

1、   直接创建:生成器

2、   间接创建:工厂方法、抽象工厂、原型、单例

对于第一次接触设计模式的同学,可能会问,生成器等等这些模式都是什么意思啊。没事,不用着急,在下面分析的时候,可能就会清楚它到底是怎么回事。

对于直接创建不就是直接构造嘛,谁都会阿,直接一个new就是了,还能玩出什么花招?还真有,生成器就是,new完之后,构造还没有结束,提供给你一系列接口用来构造,然后才返回结果,这才是最终想要的。会java或者c#的同学应该知道StringBuilder,就是采用了生成器模式。先构造StringBuilder, 然后往里面添加字符啊、数字啊,最后才返回需要的字符串。

间接创建都不直接构造,那么又由谁构造呢,根据构造的位置可以这样分:

1、   构造类自己:单例

2、   构造类实例:原型

3、   构造类子类:工厂方法

4、   其他专门用于构造的类:抽象工厂

所以你看,设计模式真是无处不在啊,很全面,你还能找出其他的构造位置吗?

我们还是来简单分析一下。首先看看构造类自己这个位置,默认的构造函数不就是在构造类自己里面吗,难道单例模式就是指默认的构造方式,这也太扯了,这也能成为一个设计模式?哈哈,别忘了函数状态除了普通的,还有静态的呢,单例就是在构造类内部创建了一个静态方法,用于返回全局中唯一实例,而构造函数被隐藏了。

构造类实例怎么回事?这个很简单,很多人都用过,就是克隆技术,在原对象上调用克隆方法来返回一个新对象。

而工厂方法就是在构造类里已经定义好一个方法,说是创建什么对象,但是不创建,让子类重写该方法来负责具体创建。

新建一个类用来专门创建对象就是抽象工厂? 没那么简单,没看见它的名字就四个字,比别人都长,又工厂又抽象的。我们先来看看工厂是什么,从我们常识来看,工厂就是生产产品的地方,这和专门用来创建产品对象的类差不多。那么抽象呢?就是对在具体工厂上面再提出了一个抽象类。这个抽象类的好处,就在于忽略了那么多具体的工厂。所以说不是谁都能用上抽象工厂的,有那么大本事开那么多工厂吗?

结构型(7个)

继续我们的先分后治的思路。

既然这7个设计模式归为结构型,那么结构涉及到什么呢?

元素和关系。

在我们软件设计中涉及到哪些元素呢?静态的有:类、包、模块、子系统。包就是类所在位置,可以忽略。所以就有剩下这三个元素:类、模块、子系统,他们之间有:

1、   类与类之间的关系

2、   类与模块的关系

3、   类与子系统的关系

4、   模块之间关系

5、   模块和子系统之间关系

6、   子系统之间关系

有些关系不是我们的讨论范围,在设计模式的定义里面已经指出,主要是讨论类和对象。所以我们看到了设计模式的边界,也知道学习好设计模式不是终点,还有很多需要下工夫的地方。和类相关的有哪些?1和3(2可以看成是3)。

1、   类与类之间:适配器、桥接、组合、装饰、享元、代理

2、   类与子系统:外观

类和子系统的外观模式是怎么回事?就是创建了一个类作为整个子系统的外观或者门面,由它来处理和子系统的交互,而不用暴露子系统内部。

接下来,我们继续分解,类与类之间有什么关系呢?主要有5种关系:

1、   泛化:适配器

2、   关联:适配器、桥接、装饰、代理

3、   聚合

4、   组合:组合

5、   依赖:享元

仔细的同学,可以看到适配器怎么又在继承里,又在关联里呢?写错了吧?哈哈,没写错,因为适配器有两种实现方式。先说说适配器是干什么的,它是把一个实现了其它接口的类的转换成期望的接口。这里适配器泛化的实现方式就是直接在这个类上实现期望的接口,而关联的实现方式就是新创建一个类实现期望的接口、然后和已有的实现了其它接口的类关联,它们都可以达到目的,就看你喜欢哪个了。

至于组合模式,组合对象和子对象形成整体和部分的关系,并且组合对象和单个对象接口一致,这样组合对象里虽然有多个子对象,但是处理起来和单个对象是没有差别的。

依赖关系是一个很弱的关系,享元模式就是靠着这个弱关系来共享大量对象的。内部状态被共享,外部状态临时传入,使用后丢掉。

现在,我们来看四个关联关系模式的分解:

1、   关联类之间接口相同:装饰、代理

2、   关联类之间接口不同:适配器、桥接

一半一半啊,还是不彻底啊!哈哈,没事,就离成功还有一步之遥了。先说2吧,这些模式都是在原有类的基础上,再添加新类,那么从原有类的变化来看:

1、   原有类改变了:桥接

2、   原有类没变:适配器

为什么说桥接模式中,原有类改变了呢?是因为桥接模式把原有类中的实现部分分离出来作为实现类,而留下抽象的部分,两部分可以独立变化。而如果有请求调用的时候,就把请求转发给实现对象。适配器模式这里就不说了,上面在讲泛化的时候一起说了。

最后,装饰和代理的区别太小了,只是目的的区别,装饰用于给对象添加功能,可以迭代装饰。而代理呢,用来控制对真实对象的访问。


好了,先写到这里把, 下次再写行为模式.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值