设计模式总结(《Head First设计模式》学习总结)

写在前面:

学习过程中不仅要熟练掌握技能,理论的消化吸收也必不可少。虽然个人更倾向于学习技术类的东西(短时间的精力投入很快就能看到成效...),但看了很多前辈的经验总结后才知道理论性的东西是绝对不能忽视的,毕竟理论对实践有着重要的指导意义。而了解“设计”相关的东西,会对“实现”产生潜移默化的影响,虽然不能在短时间内看到让人欣喜的变化,但可能有一天回过头来一想“哦~,原来我这个不错的小习惯是当年在那本书上学到的啊”

一.什么是设计模式?

绕了一圈之后让我们又回到这个话题吧(看书之前问自己一遍,看完之后再问自己一遍,答案之间的差异就是感悟了)

之前:

自问:设计模式是什么?

自答:是一些系统设计的指导原则吧,不过我现在天天写代码,应该也用不到设计层面上的东西。

自问:哦,那具体是什么?

自答:不清楚,不过我见过一些前辈的代码,结构很复杂,一看就很上档次的那种,那些应该就用了设计模式吧,所以代码有没有应用设计模式应该就是高手与新手的区别了。等我成了高手之后,这种东西还不信手拈来,嗯,不说了,我写代码去了,好好积累项目经验。

...

之后:

自问:设计模式是什么?

自答:设计模式是由代码结构优化经验萃取出来的理论知识,应用成熟的设计模式能够增强代码的可复用性、可扩展性与可维护性。

自问:你好像很专业的样子,那好,既然设计模式有这么多好处,那是不是应用了设计模式的设计都是好设计?

自答:当然不是,我们不能为了使用模式而使用模式。设计模式可不能滥用,毕竟应用设计模式必须要作出一些牺牲(比如增加类结构的复杂性...),所以滥用设计模式的话是会出事的。而且,就算我们有了锤子,也不能把所有问题都看作钉子吧?

...

P.S.还记得学习正则表达式的总结:能不用就尽量不要用(最大限度的避免滥用),设计模式与之类似,不能看到什么问题都往模式上靠,只有当我们非常确定在当前情景下确实需要用设计模式来优化我们的设计时,才考虑使用设计模式(至于到底用不用,还要权衡重构的成本与优化的收益...)

二.要不要使用设计模式?

这是个值得思考的问题,毕竟现在我们已经拥有了一把锤子,要不要用它当然成了问题,毕竟不是所有的问题都可以用锤子来解决。退一步讲,即便所有问题都能用锤子解决,我们也不确定使用锤子是不是最好的解决方案(拔钉子的话,可能用钳子更好些...)

当我们拿着某个设计模式想放进我们的代码中时,最好权衡一下利弊,诚然,设计模式具有的设计上的弹性一定会给我们之后的维护变更带来些便利。但是利与弊到底哪个更多一些,我们需要先回答几个问题再做决定:

  • 我们的项目是不是几乎不涉及维护或者没有后续版本,那么我们引入设计模式还有必要吗?
  • 我们项目的规模是不是大到了不用设计模式不行的地步?
  • 这个设计模式用在这里合适吗?有没有更合适的?
  • 非要用设计模式吗?可不可以用几个简单的设计原则来代替?
  • 引入设计模式之后,代码结构的复杂度大大增加,重构的成本我们可以接受吗?

如果深思熟虑之后,还是觉得使用设计模式比较好,那么,放心去用吧,之后好好享受设计模式带来的好处吧

三.设计原则总结

设计原则都是一些简单的指导意见,没有固定的实现,因而设计原则也更加灵活,常见的设计原则如下:

  1. 封装变化(把易于发生变化的部分抽出来,以减少其变化对其它部分的影响)
  2. 多用组合,少用继承(组合比继承更有弹性)
  3. 针对接口编程,不针对实现编程(使用接口可以避免直接依赖具体类)
  4. 为交互对象之间的松耦合设计而努力(更松的耦合意味着更多的弹性)
  5. 类应该对扩展开放,对修改关闭(open-close原则)
  6. 依赖抽象,不要依赖具体类(减少对具体类的直接依赖)
  7. 只和朋友交谈(密友原则)
  8. 别找我,我会找你(Don‘t call me, I will call you back.安卓开发的大原则)
  9. 类应该只有一个改变的理由(单一责任原则)

能用设计原则解决的问题就不要用设计模式(杀鸡焉用宰牛刀...),因为设计原则实现起来更加灵活,更加轻巧(不用去考虑模式的条条框框...)

四.设计模式总结

名称 特点
策略模式(Strategy) 把可以替换的算法步骤封装成一个个算法族,供运行时动态选择
观察者模式(Observer) 定义并维护对象之间的一对多关系
装饰者模式(Decorator) 建立拥有共同超类的装饰者与被装饰者来实现功能的动态扩展
工厂模式(Factory) 封装对象的创建过程,包括工厂方法模式和抽象工厂模式
单件(例)模式(Singleton) 用来创建唯一的对象(比如数据库连接对象,线程池对象等等)
命令模式(Command) 封装方法调用细节,解耦请求者与执行者
适配器模式(Adapter) 用来实现不同接口间的转换
外观模式(Facade) 为复杂的子系统提供简单易用的高层接口
模版方法模式(Template Method) 用来封装算法骨架(流程),某些步骤由子类实现
迭代器模式(Iterator) 用来封装遍历细节
组合模式(Composite) 提供一种层级结构,使得我们能够忽略对象与对象集合间的差异,一视同仁地对待它们
状态模式(State) 把所有动作都封装在状态对象中,状态持有者将行为委托给当前状态对象
代理模式(Proxy) 通过插入第三方(代理对象)来分离调用者和被调用者(不同于执行者)
复合模式(Compound) 将多个模式组合结合起来形成一个“框架”,以解决一般性问题
桥接模式(Bridge) 将抽象的控制类与具体实现类通过组合解耦,使得抽象层类与实现层类可以对立与对方而变化
生成器模式(Builder) 用来封装组合结构(树形结构)的构造过程,与迭代器模式类似,都隐藏了组合结构的内部实现,只提供一组用于创建组合结构的接口
责任链模式(Chain of Responsibility) 让一个请求可以被一组接收者顺序处理,类似于Android处理请求的方式:一个接收者捕获请求后可以return true消费掉请求,也可以return false传递给接收者队列中的下一个接收者(观察者)
蝇量模式(Flyweight) 抽象出对象管理层来统一管理大量的同类型对象,以减少运行时对象实例的个数,减少内存消耗
解释器模式(Interpreter) 用来为简单语言创建解释器,将语法规则直接映射为各个类,结构简单,但效率较低
中介者模式(Mediator) 引入中介者来封装多个对象间的复杂交互,以降低同级(在类结构统一层次上的)对象间的依赖
备忘录模式(Memento) 支持对象状态的保存与恢复,并将对象状态数据封装起来,独立于客户代码以提供保护(Java中可以结合序列化反序列化技术来实现该模式)
原型模式(Prototype) 以现有的对象为原型,通过clone得到新的对象(以简化新对象的创建过程)
访问者模式(Visitor) 为组合结构添加新的操作,而不需要频繁的改变组合结构

五.面向对象的设计(Object Oriented Design)

一直伴随着OOD的问题就是“折衷”(或者说是“取舍”),最简单的例子——要不要用设计模式?

  • 用,意味着将产生复杂的类关系,多层的抽象,我们将牺牲易读性换取易扩展性、易维护性或者其它特性
  • 不用,意味着我们不需要对现有代码进行重构(或者不用去在复杂的设计上耗费过多的时间),但使用设计模式的所有好处我们就都享受不到了

二者选其一,这就是一个“取舍”,或者创造第三个选项(比如使用设计原则),这就是一个“折衷”

写在后面:关于《Head First设计模式》

很少写书评,因为每个人的喜好不同,不好作推荐(甚至有时候喜欢一本书仅仅是因为喜欢作者的行文风格而已,从而不自觉的认为书籍内容不错。。)

这本书是前辈推荐的,看完之后觉得大部分章节讲的很不错,既细致又通俗,但感觉某些章节并不是很好(比如第一章策略模式的例子不很贴切,和后面的远程代理部分细节展开的不合理)

总体来说,作为入门书籍的话,《Head First设计模式》还是不错的,个人感受,仅供参考

时间: 2024-08-30 07:10:04

设计模式总结(《Head First设计模式》学习总结)的相关文章

设计模式---装饰者模式(学习笔记)

首先看装饰者模式的定义:动态的将责任附加到对象上.若要扩展功 能,装饰者提供了比继承更有弹性的替代方案! 先看看<大话设计模式>给出的类图: 实际上,装饰者模式就是:把装饰者对象当成"包装者",换言之,把要装饰的对象作为参数传递到装饰对象里去,然后进行操作.(如果理解不对,希望给指正),下面看代码来理解这个类图: 这是装饰者和需要装饰的具体对象共同的接口: public abstract class Component { abstract void Operation()

设计模式总纲——单例设计模式

前两天写了设计模式总纲,今天就来讲讲我们在工程代码中最最最常用的设计模式了——单例设计模式,这个模式在工程代码上的出现率几乎为99.99999%,但是虽然很常用,但是用的好的人却不多,今天我们就来深入的说一说单例设计模式. 在学习一项新的知识之前,我们都要向自己提出三个问题,为什么要用这个知识,这个知识用在哪里,这个知识怎么用?既 why,where,how,3W模式,我们先来谈谈为什么需要单例设计模式,先来想想,如果一个工具类,比如一个读取配置文件的工具类,这类工具只是特定的功能类,既读取指定

设计模式浅谈之----设计模式简介

1.何为设计模式 设计模式是一个通过定义.使用和测试去解决特定问题的方法,并且由于设计模式是在面向对象之后为人所知的,基本思想与面向对象不可分割. 在软件工程中,设计模式是一般只在给定条件下会重复性发生问题而提出的一种通用的解决方案. 2.设计模式简史 设计模式的概念在计算机科学领域的普及主要归功于1994年<设计模式:可复用面向对象的软件的基础>,作者GoF(即Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides 四人) 3.设计模式

java设计模式之单例设计模式

设计模式:解决某一类问题最行之有效的方法. java中23种设计模式. 单例设计模式:解决一类在内存中只存在一个对象. Runtime()方法就是单例设计模式进行设计的. 解决的问题:保证一个类在内存中的对象唯一性. 比如:多程序读取一个配置文件时,建议配置文件封装成对象.会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的. 1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象. 2.还为了让其他程序可以访问该类对象,只好在本类中自定

[Android]GOF23种设计模式 &amp; Android中的设计模式

GOF23种设计模式 设计原则: 1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 2. 开放-封闭原则(OCP):软件实体(类.模块.函数等)应该可以扩展,但是不可修改.即对于扩展是开放的, 对于修改是封闭的. 3. 依赖倒转原则: A. 高层模块不应该依赖低层模块,两个都应该依赖抽象.B.抽象不应该依赖细节,细节应该依赖抽象.说白了,就是要针对接口编程,不要对实现编程. 4. 迪米特法则(LoD):如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用.如

设计模式之-----------单例设计模式

饿汉式: class Single { //   提前做好! private static final Single s = new Single(); //  私有化 构造函数  无法使用new 创建对象! private Single(){} //  对外提供接口 public static Single getInstance() { return s; } } 懒汉式: 懒汉 顾名思义  就是懒呗 什么时候用到 什么时候创建! class Single1 { private static

[设计模式] .NET设计模式笔记 - 有多少种设计模式

.NET下的23中设计模式. ※创建型模式篇 ●单件模式(Single Pattern) ●抽象工厂模式(Abstract Factory) ●建造者模式(Builder Pattern) ●工厂方法(Factory Method) ●原型模式(Protype Pattern) ※结构型模式篇 ●适配器模式(Adapter Pattern) ●桥接模式(Bridge Pattern) ●装饰模式(Decorator Pattern) ●组合模式(Composite Pattern) ●外观模式(

java软件设计模式只单例设计模式

概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 设计模式分为三种类型,共23种.创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式.结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.

&quot;围观&quot;设计模式(30)--结构型设计模式总结(适配器、代理、装饰、外观、桥梁、组合、享元)

设计模式代码下载地址 设计模式代码下载地址 1  适配器模式 在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper).将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中.----WIKIPEDIA 个人理解 适配器模式:将两个不一致或者说无法直接使用的类或者接口通过适配器模式进行兼容,使得他们可以在一块使用.适配器模式在之前的项目中我是用于处理数据的不兼容的,对

什么是设计模式?常见的设计模式有哪些?

设计模式是众多软件开发人员经过长期的软件开发过程中总结得来的.针对的一般性问题的通用解决方案,是一套被分类编目的.软件开发人员都知晓的.可被反复利用的.代码设计经验的总结. 使用设计模式可以提高代码的复用.避免程序大量修改从而保证代码的可靠性,同时使代码更容易被他人理解.显然设计模式不管是对自己.对他人还是对系统都是有益的,设计模式使得代码编制真正的工程化,是软件工程的基石. 在Gang of Four中总结了23种经典的设计模式,常用的设计模式有:单例模式.工厂模式.观察者模.适配器模式.亨元