什么是模式
引用
《Java与模式》
模式化的过程就是把问题抽象化,在忽略掉不重要的细节后,发现问题的一般性本质,并找到普遍适用的解决方案的过程。简而言之,人们在自己的环境中不断发现问题的解决方案的时候,发现有一些问题及其解决方案不断变换面孔出现,但这些不同的面孔有着共同的本质,这些本质就是模式。
coolshell.cn博主陈皓
在正式说明GoF的那23个经典的设计模式其实和OO关系不大并和Unix的设计思想很相似的这个观点之前,让我先来说说什么是模式?设计模式的英 文是Design Pattern,模式是Pattern的汉译。所谓Pattern就是一种规则,或是一种模型,或是一种习惯。
这么一来大千世界哪哪都模式了,就比如说Iphone自出现以后,各厂商纷纷效仿,那Iphone的用户体验也算是一种模式,当然乔布斯也算是一种模式了-雷布斯...X布斯。
背景
《设计模式》这本书由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为“四人组(Gang of Four)”,而模式的概念被引入软件设计界的时间还要在1995年之前。
1987年,Ward Cunningham 和 Kent Beck 在一起用Smalltalk 做设计用户界面的工作。他们决定使用Alexander的理论发展出一个有五个模式的语言来指导Smalltak新,因此他们写了一篇文章"Useing Pattern Languages for Object-Oriented Programs(使用模式语言做面向对象程序)"的论文(发表于 OOPSLA'87 in Orlando)。
在这之后,Jim Coplien 开始搜集C++语言的成例(idioms),这些成例发表在1991年出版的《高级c++编程风格与成例》一书中。
从1990年到1992年,“四人帮”成员开始搜集模式的工作。关于模式的讨论和工作会议则一再举行。
在1993年8月,Kent Beck和Grady Booch主持了在科罗拉多的山区度假村召开的第一次关于模式的会议。模式研究的主要人物都参加了这些会议。包括 Jim coplien,Doug Lea,Desmond D'souze,Norm kerth,Wolfgang Pree等。
在那之后不久,“四人帮”的书就出来了。
之后研究模式的人数越来越多,编程模式语言大会(PLOP),每年一次定期在美国举行,并把会议中的内容汇总成书。
这么多牛人,亮瞎了我的眼啊。
题外话:这里也有一个2008年的视频,Jim coplien和Robert C. Martin就TDD的辩论,Jim coplien反对TDD,而Robert C. Martin支持TDD。
Robert C. Martin就是下面SOLID原则的提出者。
模式的好处
- 可维护性
- 可复用性
Rober C.Martin 指出,导致一个软件设计的可维护性较低,也就是说会随着性能要求变化而“腐烂”的真正原因有四个:过于僵硬,过于脆弱,复用率低,黏度过高。
- 过于僵硬
加入一个新功能,不仅仅意味着添加一个独立的模块,而且因为这个新功能的添加会波及其它存在的模块。 - 过于脆弱
对一个地方修改,会导致看上去与这个地方无关的其它地方发生故障。 - 黏度过高
有的时候一个改动可以以保存原始设计意图和原始设计框架的方式进行,也可以以破坏原始意思和框架的方式进行。第一种会对系统的未来有利,第二种是权宜之计,可以在短时间内解决问题,但是会牺牲中长期的利益。 - 复用率低
所谓复用,就是一个软件的组成部分,可以在同一个项目的不同地方甚至是不同项目中重复使用。
每当程序员发现一段代码、函数、模块所做的事情是可以在新的模块、或者新系统中使用的时候,他们问题发现,这些代码依赖了一大堆其它东西,以至于很难将他们分开。最后,他们发现最好的办法就是不是“碰”这些已有的东西,而是重新写自己的代码。他们可能会用源代码剪贴的办法,以最原始的复用方式,节省一点时间。这样的系统就是复用率低的系统。
前三点说的是维护性,后一点说的是复用性,所以一个系统的好坏是可以从这两个大方向进行判断的,这也是设计模式想做做到的。
S.O.L.I.D原则
简介
Solid原意是"固定的,可靠的",可见原则之重要啊。呵呵 。由Robert C. Martin提出,不知道为什么大家都叫他Rob大叔。
资料
S.O.L.I.D.类设计原则
面向对象设计的SOLID原则
内容
- SRP The Single Responsibility Principle 单一责任原则
- OCP The Open Closed Principle 开放封闭原则
- LSP The Liskov Substitution Principle 里氏替换原则
- DIP The Dependency Inversion Principle 依赖倒置原则
- ISP The Interface Segregation Principle 接口分离原则
除了以上还有一些其它原则一块写上
- 迪米特
- 合成,聚合原则(Favor Composition Over Inheritance)
- 高内聚,低耦合
分类
创建模式
工厂,单例,多例,建造,原始模型
结构模式
适配器,缺省适配,合成,装饰,代理,亨元,门面,桥梁
行为模式
不变,策略,模版方法,观察者,迭代子,责任链,命令,备忘录,状态,访问者,解释器,调停者
模式
工厂模式
- 简单工厂(静态工厂)
- 工厂方法(多态性工厂)
- 抽象工厂
产品层级,产品族。经典的unix,window不同的窗口展示。
Prototype模式,原型模式
- 变量,对象以及对象的引用
- 深复制和浅复制
- ==和equail
- 克隆满足的条件
- x.clone()!=x
- x.clone().getClass()==x.getClass()
- x.clone().equails(x)
- 简单原形和注册原形(对象池)
- clone()方法 和 Cloneable接口
- 原型和串行化
适配器模式
- 类适配,对象适配
- JDBC/ODBC桥梁
- WINE
桥梁模式
定义: 将抽象化与具体化解耦。
- AWT的Peer架构
- 驱动器与JDBC驱动器
装饰模式
定义:以客户端透明的方式扩展模式的功能。
代理模式
定义:给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
装饰模式
定义
又名包装,以对客户端透明的方式扩展对象的功能。是继承关系的一种替代方案。
在什么时间使用?
- 需要扩展一个类的功能
- 需要动态地给一个对象增加功能,这些功能又可以动态的撤销
- 需要增加由一些基本功能 的排列组合而产生的非常大量的功能,而使继承关系变得不现实。
责任链模式
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成的一条链。请求在这个链上的某一个对象决定处理此请求。发出请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的同时能重新组织链和分配责任。
命令模式
把一个请求或一个操作封装到一个对象中。命令模式允许使用不同的请求把客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能。
观察者模式
又叫发布-订阅模式,模型-试图模式(Model/View)模式,源-监听器(source-listener)模式或从属者模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听谋一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自己更新自己。
Android中的广播组件其实就是一种观察者模式。
最终
你只需要做到也只有能做过以下三点时你的代码和系统才算是好的。
- 简单(单一,简洁)
- 模块
- 拼装
参考
《Java与模式》
从面向对象的设计模式看软件设计
网友评论