一、策略模式

1、生活场景

每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策略模式来描述该流程。

2、基础概念

策略模式属于对象的行为模式。策略模式中定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客 户端。

3、模式图解

打开网易新闻 查看更多图片

4、核心角色

  • 环境角色:持有一个Strategy策略接口角色的引用。
  • 抽象策略角色:通常由一个接口或抽象类实现。此角色给出所有的具体策略类要实现的接口。
  • 具体策略角色:包装相关的算法或业务流程。

5、模式总结

策略模式的关键是:变化的与不变分离,体现了“对修改关闭,对扩展开放”原则。客户端增加行为不用修改原有代码,只要添加一种策略即可,易于切换、易于理解、易于扩展。策略过多是会导致类数目庞大,变得难以维护。

二、访问者模式

1、场景描述

电竞是游戏比赛达到“竞技”层面的体育项目。利用电子设备作为运动器械进行的、人与人之间的智力对抗运动。通过电竞,可以提高人的反应能力、协调能力、团队精神等。但是不同人群的对电竞的持有的观念不一样,有的人认为电竞就是沉迷网络,持反对态度,而有的人就比较赞同。下面基于访问者模式来描述该场景。

2、场景图解

3、基础概念

访问者模式是对象的行为模式,把作用于数据结构的各元素的操作封装,操作之间没有关联。可以在不改变数据结构的前提下定义作用于这些元素的不同的操作。主要将数据结构与数据操作分离,解决数据结构和操作耦合问题核心原理:被访问的类里面加对外提供接待访问者的接口。

4、模式图解

打开网易新闻 查看更多图片

5、核心角色

  • 抽象访问者角色:声明多个方法操作,具体访问者角色需要实现的接口。
  • 具体访问者角色:实现抽象访问者所声明的接口,就是各个访问操作。
  • 抽象节点角色:声明接受操作,接受访问者对象作为参数。
  • 具体节点角色:实现抽象节点所规定的具体操作。
  • 结构对象角色:能枚举结构中的所有元素,可以提供一个高层的接口,用来允许访问者对象访问每一个元素。

6、模式总结

(1) 访问者模式符合单一职责原则、使程序具有良好的扩展性、灵活性;

(2) 访问者模式适用与拦截器与过滤器等常见功能,数据结构相对稳定的场景;

(3) 访问者关注其他类的内部细节,依赖性强,违反迪米特法则,这样导致具体元素更新麻烦;

(4) 访问者依赖具体元素,不是抽象元素,面向细节编程,违背依赖倒转原则;

三、备忘录模式

1、场景描述

常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放。下面基于备忘录设计模式来描述该场景流程。

2、场景图解

3、基础概念

备忘录模式属于行为型模式,其用意在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。后续可将该对象恢复到原先保存的状态。备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作。

4、模式图解

5、核心角色

  • 备忘录角色:负责保存对象状态的记录,即Originator内部状态。
  • 发起人角色:创建一个含有当前的内部状态的备忘录对象,用来保存状态。
  • 守护者对象:提供合理的方式,负责保存多个备忘录对象。

6、模式总结

备忘录模式提供一种可以恢复状态的机制,实现状态的封装,能够比较方便地回到某个历史的状态;常常与命令模式和迭代器模式一同使用。如果类的成员变量过多,会占用比较大的内存资源,为了节约内存,备忘录模式可以和原型模式配合使用。