设计模式学习总结

1.单例模式

描述

确保某个类只有一个实例,而且自行实例化并向整个系统提供整个实例。

核心概述

一个可以自行实例化(仅能实例化一次),并提供一个返回该实例的方法的类。

要点
  1. 构造方法私有化
  2. 内部自己new一个实例
  3. 提供一个静态方法返回这个实例,因而这个实例也是静态变量

2.工厂方法模式

描述

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

核心概述

工厂方法就是new一个对象的替代品(简单工厂模式、抽象工厂模式也是一样),简而言之就是调用方法将返回你所需要的对象。此模式就是用来创建实例的

要点
  1. 传入类名,返回对应的实例,通常传入子类类名,可返回父类类型的实例;
  2. 生产各种类型的实例。

3.抽象工厂模式

描述

为创建一组相关或相互依赖的对象提供一个接口。而且无需指定它们的具体类。

核心概述

注意!不同于工厂方法模式,抽象工厂模式虽然也是new一个对象的替代品,但是此方法不需要传入类名的,也就是说它不是什么类型的实例都生产,或者说它生产的实例的类型是指定的、有限的,并且它生产的实例之间有一定的关系(互为依赖或为一组),在有多个业务品种、业务分类时,通过抽象工厂模式生产需要的对象是一种非常好的解决方式。

要点
  1. 定义一个抽象工厂类,类中有多个创建实例的抽象方法;
  2. 定义多个子工厂类继承自父工厂,子工厂负责创建实例,每个工厂负责创建一族产品。

4.模板方法模式

描述

定义一个执行某种操作的算法框架,将一些步骤的实现延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

核心概述

模板方法就是包含多个基本方法的方法,基本方法在父类中实现,而模板方法则是将这些基本方法按一定规则组织起来。

要点
  1. 定义一个抽象类或接口,接口中包含基本方法和模板方法;
  2. 模板方法按一定规则组织若干个基本方法;
    注:
    基本方法
    基本方法也叫作基本操作,是由子类实现的方法,并且在模板方法中被调用。
    模板方法
    可以有一个或多个,一般是一个具体方法(也可以是抽象方法),也就是一个框架,实现对基本方法的调度,完成固定的逻辑。为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。

5.建造者模式

描述

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

核心概述

建造者模式很难概括,它没有绝对统一的标准,它一般有四个角色,分别是:产品、抽象建造者、建造者、指挥者,只需记住:建造者负责提供、建造实例,而指挥者负责组织、管理实例的各个部件(也就是属性),并向外提供实例。与工厂模式不同的是:建造者模式更加关注部件装配的顺序。它主要用来组装复杂的实例。

要点
  1. 四个基本角色:产品、抽象建造者、建造者、指挥者;
  2. 指挥者调用建造者的一些方法组织部件的装配顺序(或者叫方法的调用顺序);
  3. 建造者负责建造,指挥者负责组织、管理;
  4. 使用时考虑结合模板方法模式。

6.代理模式(也叫委托模式)

描述

为其他对象提供一种代理以控制对这个对象的访问。

核心概述

代理模式主要用于代理某一真实角色执行指定主题的各个活动(方法)。可以这样理解,代理者和被代理者都可以执行指定主题各个活动。而与被代理者不同的是:代理者除了可以执行基本的活动外,还可以在活动前或活动后执行某些预备或善后工作。

要点
  1. 三个基本角色:主题类、真实角色、代理角色;
  2. 真实角色和代理角色均实现主题类的方法,代理角色可实现其他的接口;
  3. 代理角色代替真实角色执行指定活动,并可以在活动前或活动后执行某些预备或善后工作。
分类
  1. 普通代理:客户端只能访问代理角色,而不能访问真实角色,真实角色由代理角色内部实现;
  2. 强制代理:必须通过代理才能访问主题;
  3. 动态代理:实现阶段不用关心代理谁,运行阶段才能指定代理哪一个对象。

7.原型模式

描述

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。或者也可简单定义为:不通过new关键字来产生一个对象,而是通过对象复制来实现的模式就叫做原型模式

概述

简而言之,因为要创建很多具有部分相同属性的实例,全都通过new来产生实例比较耗性能,所以通过对象复制(Clone)来产生实例,这种产生实例的方式就叫:原型模式。

要点
  1. 类实现 java.lang.Cloneable 接口;
  2. 覆写 java.lang.Object的 clone接口;
  3. 使用时注意深拷贝浅拷贝

8.中介者模式

描述

用一个中介对象封装一系列的对象交互,中介者使得对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

概述

中介者模式一般包含3个角色,分别是:中介者、抽象中介者、同事。抽象中介者中定义相关联的同事,同事中定义中介者,同事间的调用均先调用中介者,再由中介者完成实际调用。中介者模式主要用来解耦合。

要点
  1. 三个基本角色:中介者、抽象中介者、同事,通常同事继承自抽象同事;
  2. 抽象中介者中定义相关的同事,同事中定义中介者;
  3. 同事间的调用通过中介者来完成。

9.命令模式

描述

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

概述

命令模式主要实现对执行命令的封装,将调用者和接收者进行解耦,使用命令连接两者。命令模式一般有三个角色,调用者、接收者、命令,接收者一般定义为一个抽象类,并有多个实现类,同时命令也是如此,命令可以有N个。

要点
  1. 三个基本角色:调用者、接收者、命令;
  2. 调用者通过对命令的调用来间接调用接收者;
  3. 调用者内设置命令,并执行命令,命令内定义接收者,并完成对接收者的调用。

10.责任链模式

描述

使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。使这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

概述

责任链模式就是处理请求的,请求可沿着这条处理链传递,直到找到对应的处理者(处理者可以是多个)。

要点
  1. 请求一般被封装成一个对象,并含有一个可被处理者判断是否需要自己处理该请求的标志属性;
  2. 处理者通常都继承自一个抽象处理者,抽象处理者中定义着下一个处理者;
  3. 链中每个节点都需要设置下一个处理者(如没有下一个处理者,则不需设置)。

11.装饰模式

描述

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更灵活。

概述

装饰模式类似代理模式,不同的是装饰模式灵活,可以动态地给对象增加职责,主要用于解决多继承。

要点
  1. 一般四个角色,抽象构件、具体构件、抽象装饰者(继承自抽象构建)、具体装饰者(继承自抽象装饰者),具体装饰者一般有多个,可以动态地装饰具体构件;
  2. 抽象装饰者中定义抽象构件,并通过构造方法传入要装饰的构件;
  3. 装饰者中调用抽象构件的方法,即对传入的构件进行装饰。

12.策略模式(政策模式)

描述

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

概述

策略模式主要实现对算法的封装,主要应用于有多种计算规则的业务中,例如打折优惠、不同等级会员优惠等,根据传入的参数选择相应的计算策略。

要点
  1. 计算规则较多,并且需要灵活切换计算规则;
  2. 至少三个角色,抽象策略、具体策略、上下文封装角色(封装、调用策略);

13.适配器模式

描述

将一个类的接口编程客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

概述

适配器模式是一种补偿模式,它使得两个不同接口的实现类可以一起工作,适配器就是连接这两个接口的。

要点
  1. 三个角色,目标角色类、原角色接口、适配器角色类;
  2. 适配器角色通常实现原角色接口、继承目标角色类(如果目标角色类较多,由于Java不支持多继承,所以可以使用组合模式,将目标角色定义在适配器角色内);
  3. 适配器是一种补偿模式。

14.迭代器模式

描述

提供一个方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。

概述

其实就是Java中的iterator,Java中的容器基本都提供该迭代器的实现,所以这个模式几乎不需我们实现了。

15.组合模式

描述

将对象组合成树形结构以表示“部分—整体”的层次结构,使得用户对单个对象的使用具有一致性。

概述

组合模式主要用于描述存在类似树形结构的对象间的关系,类似父子关系。

要点
  1. 一般有三个角色,分别是:抽象构件角色、叶子构件(继承自抽象构件角色)、树枝构件(继承自抽象构建角色)。

16.观察者模式(发布订阅模式)

描述

定义对象间一种一对多的依赖关系,使得每当一个对象改变,所有依赖于它的对象都会得到通知并被自动更新。

概述

多个对象监控一个对象的状态,当被监控者状态改变时,可通知所有监控者,被监控者可自由增加、删除监控者。

要点
  1. 一般含有四个角色,分别是:被观察者、观察者、具体的被观察者、具体的观察者;
  2. Java已提供可被观察类 java.util.Observable 和观察者接口 java.util.Observer。

17.门面模式

描述

为一组子系统提供一个统一的访问接口。门面模式定义了一个高级的接口使得更易于使用。

概述

简而言之,门面模式就是将一组业务相似的子系统封装在一个门面对象中,并提供相应的访问方法,外部通过门面对象的访问方法访问子系统。

要点
  1. 一般有两个角色,门面角色和子系统角色;
  2. 子系统封装在门面对象内,门面对象提供访问子系统的方法;
  3. 门面对象内不可有业务处理操作,它仅仅提供对子系统的访问,不提供任何业务处理,是任何!

18.备忘录模式

描述

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

概述

备忘录模式就是将对象的状态备份在对象之外,以便在需要时可以根据该备份恢复对象的状态 。

要点
  1. 一般有三个角色,分别是:发起人角色(被备份者)、备忘录角色(保存对象的状态)、备忘录管理员角色(对备忘录提供管理、保存);
  2. 发起人角色要包含创建备忘录和根据备忘录回复状态的功能;

19.访问者模式

描述

封装一些作用于某种对象结构中的各元素的操作,它可以在不改变这些对象结构的前提下定义作用于这些元素的新的操作。

概述

将对一个对象中一些属性的访问定义在访问者中,对象内部实现访问者的访问,通过这种方式,使得对对象属性的访问可以在不修改对象的类的结构的前提下自由修改对该对象属性的访问方式。

要点
  1. 一般包含四个角色,分别是:抽象访问者(声明访问者可以访问哪些类)、具体访问者(实现要访问类的哪些元素)、抽象被访问者(声明接受哪些访问者的访问)、具体被访问者(实现访问方法);
  2. 核心即是被访问者提供一个接受访问者访问的方法,访问者内部定义要访问的元素及访问形式。

20.状态模式

描述

当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了它的类。

概述

当一个类的行为因状态的改变而改变时可以使用状态模式(或者说一个类的行为需要根据状态而执行,而状态又比较多,含有多重判断),状态模式将一个类的状态以多个状态对象来表示,并且这个类内部含有一个当前状态对象,类可以设置当前状态对象。

要点
  1. 一般含有三个角色,分别是:抽象状态角色、状态角色、环境角色;
  2. 抽象状态角色内部定义类的所有行为及环境角色;
  3. 环境角色内定义此类的所有状态对象(一般用final和static修饰)和当前状态对象,环境角色提供设置当前状态的方法;
  4. 每一个状态对象都持有当前环境角色,状态对象的行为改变时,同时改变环境对象的当前状态对象。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值