《HeadFirst设计模式》小结

目录

设计模式定义

设计模式是在某情境下,针对某问题的解决方案。

  • 情境就是应用某个模式的情况。这应该是会不断出现的情况。
  • 问题就是你想在某情境下达到的目标,但也可以是莫情境下的约束。
  • 解决方案就是你所追求的:一个通用的设计用来解决约束,达到目标

设计模式分类

根据模式的目标通常分为三个不同的类别:创建型、行为型和结构型。

  • 创建型:创建型模式涉及到将对象实例化,提供一个方法来将客户从所需实例化的对象中解耦。例如单例,工厂方法,抽象方法,生成器。
  • 行为型:行为型模式设计到类和对象如何交互以及分配职责。例如策略,观察者,命令,模板方法,迭代器
  • 结构型:结构型模式可以让你把类或对象组合到更大的结构中。例如装饰者,外观,适配器,代理,组合。
    《HeadFirst设计模式》小结

常见的设计模式

一.策略模式

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计原则

  • 封装变化
  • 针对接口编程,而不是针对实现编程
  • 多用组合,少用继承

应用场景

  • JDK中Comparator

二.观察者模式

定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。出版者+订阅者=观察者模式。主题(Subject)是被观察的对象,而其所有依赖者(Observer)成为观察者。主题中具有注册和移除观察者,并通知所有注册者的功能,主题是通过维护一张观察者列表来实现这些操作的。观察者拥有一个主题对象的引用,因为注册、移除还有数据都在主题当中,必须通过操作主题才能完成相应功能。

设计原则

  • 为交互对象之间的松耦合设计而努力 当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。由于松耦合的两个对象之间互相依赖程度很低,因此系统具有弹性,能够应对变化。

三.装饰者模式

动态地将责任附加在对象上.如要拓展功能,装饰者提供了比继承更有弹性的替代案 装饰者和被装饰对象有相同的超类型。你可以用一个或多个装饰者包装一个对象。既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

应用场景

  • JDK中IO
  • Mybatis 二级缓存

四.工厂方法模式

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象

五.单例模式

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计原则

  • 封装变化
  • 针对接口编程,而不是针对实现编程
  • 多用组合,少用继承

六.命令模式

命名模式将“请求”封装成对象,以便使用不用的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。
在被解耦的两者之间是通过命令对象沟通的,命令对象封装了接收者和一个或者一组动作。

七.适配器模式

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

八.外观模式

提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统中的接口更容易使用。 外观将客户从一个复杂的子系统中解耦, 实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。

九.模板方法模式

在一个方法中定义一个算法的骨架,将一些方法的实现放到子类中。
模板方法使得子类可以在不改变算法的结果下,重新定义算法中的某些步骤。

相关模式

  • 策略模式和模板方法模式都用来封装算法,一个用组合一个用继承。

十.迭代器模式

提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示.
迭代器模式把遍历元素的职责交给迭代器而不是聚合对象
使用JDK5以上foreach语法则不需要显示创建迭代器

十一.组合模式

允许你将对象组合成树形结构来表现“整体/部分”层次结构.组合能让客户以一致的方式来处理个别对象以及对象组合。

十二.状态模式

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类
状态模式将状态封装为独立的类,并将状态委托给代表当前状态的对象。
使用组合通过简单引用不同的状态对象来造成类改变的假象。

相关模式

状态模式和策略模式有相同的类图,但是它们的意图不同

  • 策略模式是除了继承之外的一种弹性替换方案。通过组合不同的对象来改变行为。
    策略模式通常会用行为或者算法配置上下文类。
  • 状态模式是在上下文中放置很多判断条件的替换方案。状态模式允许上下文随着状态的改变而改变行为。

十三.代理模式

为另一个对象提供一个替身(代理)或者占位符以控制对这个对象的访问
被代理的对象可以是远程对象,创建开销大的对象或需要安全控制的对象.

应用场景

  • 远程代理:管理客户和远程对象之间的交互
  • 虚拟代理:控制访问实例化开销大的对象
  • 保护代理:基于调用者控制对对象方法的访问
  • 动态代理:运行时动态创建代理类。 JDK自带(只支持对interface代理),CGLIB

十四.复合模式

在一个解决方案中结合两个或者多个设计模式,来解决一般或者重复发生的问题。
例如MVC模式。