《Head First 设计模式》--常用的设计模式总结精华

《Head First 设计模式》--常用的设计模式总结精华

4728发表于2015-10-26

《Head First 设计模式》这本书是我比较喜欢的一本讲设计模式的书,我第一次看这本书是在我刚开始工作的时候,当时看的是同事的中文版,最近看看的是英文版,英语好的同学建议看英文版。这本书它把设计模式讲的很生动,而不是很死板的列出对应设计模式的代码。《Head First 设计模式》通过对话的和模拟实际情况展示了设计的演化过程,生动有趣,就像在讲故事一样,而且最后还有一些点睛之笔总结设计模式和OOA&OOD的精华。

今天把《Head First 设计模式》这本书里面,我觉得比较精华的部分分享出来,当在OOA软件设计上遇到问题时,拿出来参考,找点灵感。

1、策略模式-鸭子,超市费用计算


策略模式:定义了算法族,分别封装起来,让它们可以相互替换,让算法的变化独立于使用算法的客户。
策略模式要点:
  • 良好的OOA设计必须要有可复用,可扩充,可维护三大特性
  • 模式可以使我们建造出有良好OOA设计质量的系统
  • 模式被认为是历经验证的OOA设计经验
  • 模式不是代码,是针对设计问题的通用解决方案
  • 模式不是被发明而是被发现
  • 大多数的模式和原则,都是着眼于软件变化的主题
  • 大多数的模式都允许系统局部改变而独立于其它部分
  • 我们常把系统会变化的部分抽离出来

2、观察者模式---------气象站(温度,气压,热度),猎头与求职者


气象站:



总结:
观察者模式:定义了对象之间一对多的依赖,这样一来,当一个对象改变状态时,它的所依赖对象都会收到通知并自动更新。
观察者模式要点:
  • 观察者模式对象之间一对多的关系
  • 主题(可观察者),用一个共同的接口来更新可观察者
  • 观察者与可观察者采用松耦合方式结合,可观察者不知道观察者的实现细节,只知道观察都实现了观察者接口


3、装饰者模式---------饮料(星巴兹)


装饰者模式:动态地将职责附加到对象上,若要扩展功能,装饰者模式将提供比继承更有弹性的替代方案。
装饰者模式要点:
  • 继承是属于扩展形式之一,但不见得是达到弹性设计的最佳方式
  • 在我们的设计中,应该允许行为可以扩展,而无须修改现有的代码
  • 组合和委托可用于在运行时动态的加上新的行为
  • 除了继承,装饰者模式也可以让我们扩展行为
  • 装饰都模式意味着一群装饰都类,这些类用来包装具体组件
  • 装饰者类反映被装饰的组件类型(事实上,它们具有相同的类型,都经过接口或继承实现)
  • 装饰者可以在被装饰者的行为前面或后面加上自己的行为,甚至可以把被装饰都的行为整个都替换掉,而达到特定的目的
  • 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
  • 装饰者会寻到设计中出现很多小对象,如果过度使用,会使程序变得很复杂

4、工厂方法模式-------Pizza(解决new对象的问题)

所有的工厂模式都是用来封装对象的创建。工厂模式通过让子类决定该对象创建的对象是什么,来达到将对象创建过程封装的目的。




利用静态方法定义一个简单工厂,这是最常见的技巧,学被称作静态工厂。为什么要用静态方法,因为可以不用创建对象的方法来实例化来调用方法,但请记住,这也有一个缺点,不能通过继承来改变创建方法的行为。
工厂方法模式:定义了一个创建对象的接口,但由子类决定实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
工厂方法模式要点:
  • 所有的工厂都是用来封装对象的创建
  • 简单的工厂,虽然不是真正的设计模式,但仍不失为一种简单的方法可以让客户程序从具体类解耦
  • 工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象
  • 工厂是很有威力的技巧,帮助我们针对抽象编程,而不要针对具体编程
  • 所有工厂模式都是减少应用程序和具体类之间的依赖促进松耦合
  • 工厂方法允许类将实现化延迟到子类


5、抽象工厂模式-----Pizza原料(分区域)

抽象工厂方法模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类型



抽象工厂方法模式要点:
  • 抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中
  • 抽象工厂创建相关的对象家族,而不是依赖他们的具体类

6、单件模式---巧克力工厂的锅炉

单件模式:确保一个类只有一个实例,并提供一个全局的访问点。
单件模式要点:
  • 单件模式确保程序中一个类最多只有一个实例
  • 单件模式也提供了访问这个实例全局的点
  • 多线程需要保证实例的唯一性

7、命令模式---遥控器、点餐

命令模式:将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其它对象。命令模式也支持可撤消的操作。


命令可以将运算块打包(一个接受者和一组动作),然后将它们传来传去,就像一般的对象一样。

命令模式的运用:日程安排,线程池,工作队列等等。

命令模式要点:
  • 命令模式将发送请求的对象和执行请求的对象解耦
  • 在被解耦两者之间是通过命令对象进行沟通的,命令对象封装了接收者和一个或一组动作
  • 调用者通过调用命令对象的execute发出请求,这会使接收者的动作会被调用


8、适配器与外观模式

适配器模式:将一个类的接口转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间


装饰者:不改变接口,但加入责任
适配:将一个接口转成另一个接口
外观:让接口更简单

外观模式:

改变接口的新模式,为了简化接口,将一类或数个类的复杂的切隐藏在背后,只显露一个干净美好的外观。

提供了一个统一的接口,用来访问子系统中的一群接口。

外观定义了一个高层接口,让子系统更容易使用。


外观模式一个比较好的特征:提供简化接口的同时,依然将系统完整的功能暴露出来以供需要的人使用。

9、模板方法模式--封装算法(泡咖啡和茶)

模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。
模板方法模式:在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法在不改变算法结构的情况下,重新定义算法中的某些步骤

模板方法的要点:
  • “模板方法”定义了算法的步骤,把这些步骤的实现延迟到子类。
  • 模板方法为我们提供了一种代码复用的重要技巧
  • 模板方法的抽象类可以定义具体方法,抽象方法,和钩子。
  • 抽象方法由子类实现
  • 钩子一是一种方法,它在抽象类中不做任何事或只做默认事情,子类可以选择要不要去覆盖它。
  • 好莱坞原则告诉我们,将决策权放在高层模块,以便总决定何时以及如何调用低层模块。
  • 你将在真实世界代码中看到许多模板方法模式的许多变体,不要指望一眼就可以被你认出。
  • 策略模式和模板方法模式都是封装算法,一个是用组合,一个是用继承
  • 工厂方法是模板方法的一个特殊版本

10、迭代器与组合模式:管理良好的集合


11、状态模式:事物的状态


12、代理模式:控制对象访问


13、复合模式:模式中的模式


14、与设计模式相处:真实世界中的模式


15、总结OOD&OOA设计原则和精髓


封装、多态,抽象,继承

设计原则
1、多用组合,少用继承 
2、封装变化
3、针对接口编程,而不针对实现编程
4、为了交互对象之间的松耦合设计而努力
5、类应该对扩展开放,对修改关闭
6、依赖倒置原则(Dependency Inversion Principle):要依赖于抽象,不要依赖于具体,也就是不能高层组件依赖于低层组件,“二者”都应该依赖于抽象。
7、最少知识原则:只和你的密友谈话
8、好莱坞原则:别调用我们(打电话),我们会调用你(打电话)。
好莱坞原则下我们允许低层组件把自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些低层组件。换句话说:
高层组件对待低层组件的方式是“别调用我们,我们会调用你


小编蓝狐