为什么用行为性模式?
- 行为型模式关注点“
怎样运行对象/类
?”所以我们关注下类/对象的运行时流程控制 - 行为型模式用于描述程序在运行时复杂的流程控制
- 描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配
- 行为型模式分为
类行为模式
和对象行为模式
,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大灵活性。
模板方法(Template Method)模式
:父类定义算法骨架,某些实现放在子类策略(Strategy)模式
:每种算法独立封装,根据不同情况使用不同算法策略状态(State)模式
:每种状态独立封装,不同状态内部封装了不同行为- 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任割开
职责链(Chain of Responsibility)模式
:所有处理者封装为链式结构,依次调用- 备忘录(Memento)模式:把核心信息抽取出来,可以进行保存
- 解释器(Interpreter)模式:定义语法解析规则
观察者(Observer)模式
:维护多个观察者依赖,状态变化通知所有观察者- 中介者(Mediator)模式:取消类/对象的直接调用关系,使用中介者维护
- 迭代器(Iterator)模式:定义集合数据的遍历规则
- 访问者(Visitor)模式:分离对象结构,与元素的执行算法
除了模板方法模式
和解释器模式
是类行为型模式
,其他
的全部都属于对象行为型模式
。
🍭设计模式之模板方法(Template Method)【行为型模式】
🍎模板方法
-
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
模板方法(Template Method)包含两个角色
- 抽象类/抽象模板(Abstract Class)
- 具体子类/具体实现(Concrete Class)
🍔代码实现
/**
* 定义模板
*/
public abstract class CookTemplate {
/**
* 定义算法:定义好了模板
* 父类可以实现某些步骤
* 留关键给子类
*/
public void cook() {
// 定义算法步骤
heating();
addfood();
addsalt();
stirfry();
end();
}
// 加热方法
public void heating() {
System.out.println("开火......");
}
// 添加食物
public abstract void addfood();
// 加盐
public abstract void addsalt();
// 翻炒
public void stirfry() {
System.out.println("翻炒中......");
}
// 出锅
public void end() {
System.out.println("出锅......");
}
}
public class AutoCookMachine extends CookTemplate{
@Override
public void addfood() {
System.out.println("鸡腿入锅");
}
@Override
public void addsalt() {
System.out.println("三少盐");
}
}
public class MainTest {
public static void main(String[] args) {
AutoCookMachine machine = new AutoCookMachine();
machine.cook();
}
}
开火......
鸡腿入锅
三少盐
翻炒中......
出锅......
🍕应用场景
- Spring 的整个继承体系都基本用到模板方法;BeanFactory
- JdbcTemplate、RedisTemplate 都允许我们再扩展…
- 我们自己的系统也应该使用模板方法组织类结构