关于设计模式的思考
古人言“学而不思则罔,思而不学则殆“。现在回想这句话,感觉非常的有道理,只有把学习和思考结合起来,才能学到切实有用的知识,否则就会收效甚微。
前段时间再次学习了一遍设计模式,有时候想设计模式是不是就是面向对象编程的圣经了?它能否带给我一个一个精良的设计理念了?而我仅仅希望传统的23种设计模式,能在我脑海中形成几点挥之不去的元快照,它们能自由组合,自由的在不同的场景中闪现。
这里我也不再高谈阔论什么高耦合,低内聚;什么一切皆是对象;什么封装多态;什么开闭原则等等开发设计原则了,虽然这几点就是设计模式的目的。而我的目的仍旧佷明确,就是为了得到几点元快照。
23种传统设计模式,在划分上也大概分为了三种,结构型模式(7)、创建型模式(5)、行为型模式(11)。很神奇的遍布了类组的设计,创建以及实例组的运行方式,也许这就是一个建筑应有的样子,在建造之初,优秀的设计师和建筑师会夜以继日的勾画和测量,为的就是得到一个满意的设计蓝图,到了施工建造这个建筑时,又会有一队优秀的工程人员,他们有着丰富的经验以及对设计的尊敬和恪守,建筑也会随着时间的推移慢慢成型,当然期间也会涉及到建筑的部分改造。有一天,这栋完美的建筑就耸立在城市的中间,它能带来什么了,周边的商业,周边的其他建筑。。。。。最后它成了这个城市的标记。这段文字,读起来显得有些粗糙,不过它也大概描叙了23种设计模式所属时间和空间上的定位,它们不是冗杂在一起的,它们有各自适合的场景和时机。
通读gof的23种设计模式,会发现很多模式在结构上很相似,但能划分成不同的模式,自然是存在差异性的,比如说侧重点,比如说宏观环境等。下面谈谈自己的一些理解吧。
抽象工厂模式和工厂方法模式,说到工厂,那自然是造东西的地方了。这两种设计模式思考的方式是很不一样的,虽然同属于创建型模式。工厂方法模式,它是一个比较传统的单一的,每有一个产品或者说一个新类,就需要有一个对应的实际工厂来生产或者创建,用不同的工厂类来解耦了不同类的创建。而抽象工厂模式则不同,它是从产品的角度,对产品进行了划分,将产品划分成多种型号,而不同产品可能会有相同的型号,每个实际抽象工厂能生产同一型号的产品,这样就实现了一个工厂生产多种类型的产品,但要保证这些产品属于同一型号。
适配器模式、装饰模式以及代理模式,这三个模式都是结构型模式。这个就明显是侧重点和应用场景的不同而衍生出的三种模式。首先适配器模式,强调将类的接口转换成客户希望的另一个接口,它的意思更多的是方法名的转换。装饰者模式,给一个方法添加额外的职责,它强调的是对原有接口的扩展或者说功能的增强但不改变接口名。代理模式,这个思考起来,就有一种很明显的结构上的概念,外部必须通过我访问实际类,也就是说对外屏蔽了实际类,但实现细节上也就是扩展或者适配。
策略模式和状态模式,也是一对相似的模式。
也不做太多记录了,到此打个tag(我学过设计模式)(:。