1、模板模式
2、命令模式
3、备忘录模式
模板模式:
从上面可以看出:template方法默认是用作统计method方法的执行时长,但是有的时候我们无需统计代码时长,template函数中有一些其它逻辑要执行,在这里我们可以考虑采用钩子函数;钩子函数被子类覆写,覆写成false,那么method方法就不会被调用,不再统计代码时长了;前端框架Vue的生命周期就有多处用到钩子函数;
注意事项和细节
-
钩子函数
在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子” -
算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
-
一般模板方法都加上 final 关键字, 防止子类重写模板方法
-
应用
Spring IOC容器加载
命令模式:
专业术语:
Command:命令
ConcreteCommand:具体的命令
Invoker:调用者
Receiver:接受者
案例
需求:万能遥控器的制作
注意事项和细节
将发起请求的对象与执行请求的对象解耦
容易实现对请求的撤销和重做
空命令也是一种设计模式,它为我们省去了判空的操作
命令模式不足:
可能导致某些系统有过多的具体命令类,增加了系统的复杂度
与外观模式相似:都是将多个功能聚合在一起
外观模式更多适用于维护;命令模式更多应用于设计;
应用
Spring框架中的JdbcTemplate类
容易设计一个命令队列。只要把命令对象放到列队,就可以多线程的执行命令
界面的一个按钮都是一条命令、模拟 CMD(DOS 命令)订单的撤销/恢复、触发- 反馈机制
备忘录模式
-
术语
Memento:备忘录
originator:发起者
Caretaker:守护者
应用:
事务回滚
游戏的存档
Selenium动态解析资源树
注意事项和细节
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
- 实现了信息的封装,使得用户不需要关心状态的保存细节
注意:
如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存