xiaoqin

设计模式之前提--设计模式思想

设计模式之前提--设计模式思想

我一直都只是个看客,很少发言,偶然加入西西的群,被感染的童心大起,所以就想写点什么,一看设计模式大家讨论的是相当地热闹,再加上自己几年来的设计摸索,一时童心大发就想说两句。

其实网上这方面的文章很多,看到很多人的回复,尤其是争论,最后发展到人生攻击,让我愈发意识到:对设计模式的思想应该先有个正确的认识,然后才可以很好的去交流设计模式。

设计模式思想是什么:

设计模式可以理解成一种经验,是大家在重复处理某些同类型问题的时候,总结出来的一些“经验”,采用这些经验可以大幅提高代码的复用性和扩展性以及维护性(当然还有很多其他特性),可惜这些东西是“经验”,或者说是一种思想,思想类的东西不太容易表现和传承,所以人们开始总结,开始想办法图形化和量化,让其他人可以理解、可以学习。这就是现在的二十多种设计模式。问题是将思想量化出来以后,往往会产生很多的歧义,这就是争论的开端。

所以我们今天看到这十多种设计模式的时候,一定要首先明白它根本要表达的是一种“思想”!!不是一堆类图!且勿生搬硬套类图,以为完全符合某种类图的样子就是某种设计模式,那将会完全走入设计的牛角尖!

可能我说的这些很多人半信半疑,或者感觉对,但觉得我的话很虚,所以我想举一个例子来说明一下。当然肯定也有高人觉得这简直就用不着说,就像1+1=2一样的基础,但是我还是想写出来,呵呵。

示例:

我们看一个很容易理解的模式:策略模式,如下图,我们针对一个东西Context,可能有很多种算法ConcreteStarategyA、ConcreteStarategyBConcreteStarategyC,策略模式中抽象出策略类Strategy,策略类只管不同的算法,不去管什么时候该用什么算法,而是由Context自己去决定实际用哪一个算法。

好,现在我们开始想如果不用策略模式,策略Strategy实际上是Context内部的属性或方法,Context到需要用ConcreteStarategyA的时候就写ConcreteStarategyA的逻辑,需要ConcreteStarategyB的时候就写ConcreteStarategyB的逻辑,现在我们发现Strategy是多变的,可能很快就冒出个ConcreteStarategyC来,所以我们将Strategy单独提取出来,将ContextStrategy解耦,让Context自身和Strategy自身单独演变,这么说着说着你是不是马上想到这个做法多么像是桥接模式(Bridge Pattern)啊?(如下图)

不知道大家明白我说的意思了没有?就是同样画下面一个图,你根本无法知道他到底是策略还是桥接模式? 但是他们的思想(提取多变内容,然后抽象)是完全相同的,同一个问题,你从两种不同的地方入手,其实最终达到了相同的结果,异曲同工!所以有人说这是桥接模式的应用,有人骂这哪是在讲桥接,这明明就是策略模式,不懂还在这里误倒人。其实他们都没有错,只是出发点的不同。

 

综上所述,策略是一种思想,你要完全明白它要解决的到底是什么问题,然后才能被你所用。切勿死读类图,看到别人的实例,不要一开始就否认,看看他的解决方案是否用到了这个模式的思想精髓。当然新手也不要怕这么多种设计模式我怎么能记得住?其实别看这么多种设计模式,思想归根结低就一句话:针对抽象编程!

BTW:我看TerryLee的设计模式系列写的很好,可惜没有写完,另外发现像命令模式(Command Pattern)等后面的回复留有很多的疑意,所以我想有空就从这些方面入手,补充些方便大家理解的东西了。
下一篇:命令模式

 

posted on 2007-08-06 13:00 问问 阅读(1982) 评论(12)  编辑 收藏 网摘 所属分类: Design&Pattern

评论

#1楼 2007-08-06 13:38 Maldini[未注册用户]

沙发   回复  引用    

#2楼 2007-08-06 13:53 炭炭      

我同意你的模式决不能只看类图和代码,要看所解决的问题的说法。

不过,桥接和策略区别还是很明显的:
策略是一个锥把多个锥头,桥接是多个锥把多个锥头。
一个是解决一维的变化,一个是注意多维的变化组合。

还有怎么能说所有的模式都是针对抽象编程呢?那只是一部分,所谓模式就是约定俗成的解决一类问题的方法,只要针对某类问题你有好的解决方法就可以叫模式。
  回复  引用  查看    

#3楼 2007-08-06 14:34 OK_008      

路过,学习!
  回复  引用  查看    

#4楼[楼主] 2007-08-06 15:12 问问      

To 炭炭:你指出来的桥接和策略区别非常对,谢谢关注,我主要是为了说明解决问题的思想一致。

“所有的模式都是针对抽象编程”纯粹是我个人的理解,我是越来越觉得所有的解决思想都是为了针对抽象编程,只是程度各不相同而已,这纯粹是我个人的理解,可能很多人都不认同,希望有机会我们能多交流一些
  回复  引用  查看    

#5楼 2007-08-06 15:14 volnet(可以叫我大V)      

炭炭的说法很对,既然是一种经验的积累就不可能只限制于针对抽象的编程,因为经验本身就是多元化的,而针对抽象只是被经常用到而已。   回复  引用  查看    

#6楼 2007-08-06 18:31 Justin      

模式间的异同关键在于不同模式所要针对解决的不同问题,而某些问题可以分别用多种模式来解决,原因在于这类问题正好是这些模式所要针对解决问题的集合域的交集。Just so so ¬   回复  引用  查看    

#7楼 2007-08-06 19:41 超级菜鸟      

学习   回复  引用  查看    

#8楼 2007-08-06 20:18 aspnetx      

是我浏览器的问题吗?版面看起来好别扭   回复  引用  查看    

#9楼 2007-08-07 00:36 航天奇侠


模式应该就是一招:接口统一,实现各异。
实际编写就是,将原本没有这种接口的实现,套个马甲。设计模式就是一种穿马甲的艺术。
  回复  引用    

#10楼[楼主] 2007-08-07 08:03 问问      

@Justin
非常赞成你的观点。
另外我主要想写一下各个模式是如何抽象出来的,因为我越来越觉得各个模式出发点几乎是完全相同的,同样的思路下又针对各种问题的不同特点而各具一些特色,其实在现实中不用去记这么多的设计模式,我们需要做的是从这二十多种设计模式中领悟这种思想,然后去解决现实问题,可能你实现的类图完全不同,但确实是这种思想的应用。
  回复  引用  查看    

#11楼 2007-08-07 09:02 today      

写的非常不错,设计模式说到底就是解决耦合关系,不过耦合依然会存在,只是此耦合非彼耦合,也就是,让相对稳定的对象之间建立耦合代替相对不稳定的对象之间建立耦合关系。另外,设计模式很大的程度上再利用组合解决派生带来的问题。所以说,组合与继承是设计模式中的x轴和y轴,如何把它们很好的组合在一起,这就是设计模式的精髓。   回复  引用  查看    

#12楼[楼主] 2007-08-07 10:29 问问      

@today
你说的太精彩了,佩服!
  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 844701




相关文章:

相关链接:
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

公告

test

与我联系

搜索

 

常用链接

留言簿

随笔分类(7)

随笔档案(5)

文章分类

相册

最新评论

阅读排行榜

评论排行榜