设计模式

什么是模式


引用
《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 CunninghamKent 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与模式》
从面向对象的设计模式看软件设计

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,937评论 1 15
  • 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者...
    RamboLI阅读 749评论 0 1
  • 原文链接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤独杂货铺阅读 1,513评论 0 3
  • 面向对象设计的五大原则 单一职责原则(SRP) 一个类应该仅有一个职责。 开放封闭原则(OCP) 对扩展开放,...
    LiuHDme阅读 1,460评论 0 3
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 3,792评论 3 14