🚪 传送门 :🕺 行为型设计模式:对象协作的舞蹈家(上)
🔄 第四部分:状态模式(State Pattern)
arduino
🔄 状态舞者的登场 🔄
┌─────────────────────────────────────┐
│ 🔄 状态者:我是状态变化艺术家! │
│ │
│ 🎮 角色:"我现在是正常状态!" │
│ 🔄 状态者:"我来改变行为!" │
│ 🎮 角色:"我现在是受伤状态!" │
│ 🔄 状态者:"继续改变行为!" │
│ │
│ 💡 核心思想:状态影响行为 │
└─────────────────────────────────────┘
🏗️ 状态模式UML类图

4.1 🎭 什么是状态模式?
一句话理解:对象的行为随着状态的改变而改变,就像游戏角色的不同状态!
定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
应用场景:状态机、游戏角色状态、订单状态、工作流状态
4.2 🛠️ 状态模式的实现
4.2.1 🏗️ 基本结构
💡 小贴士:状态模式就像游戏角色的状态变化,不同状态下有不同的行为表现!
核心组件:
- State(状态) :状态的抽象接口
- ConcreteState(具体状态) :具体的状态实现
- Context(上下文) :维护当前状态的对象
4.2.2 🚀 多种实现方式
实现方式 | 特点 | 推荐度 |
---|---|---|
状态接口 | 通过接口定义状态行为 | ⭐⭐⭐⭐⭐ |
状态枚举 | 使用枚举简化状态管理 | ⭐⭐⭐⭐ |
状态机 | 复杂状态转换逻辑 | ⭐⭐⭐⭐⭐ |
状态接口实现:
csharp
// 状态接口:通过接口定义状态行为
public interface VendingMachineState {
void insertCoin();
void ejectCoin();
void selectProduct();
void dispense();
}
public class NoCoinState implements VendingMachineState {
private VendingMachine vendingMachine;
public NoCoinState(VendingMachine vendingMachine) {
this.vendingMachine = vendingMachine;
}
@Override
public void insertCoin() {
System.out.println("投币成功");
vendingMachine.setState(vendingMachine.getHasCoinState());
}
@Override
public void ejectCoin() {
System.out.println("没有投币,无法退币");
}
@Override
public void selectProduct() {
System.out.println("请先投币");
}
@Override
public void dispense() {
System.out.println("请先投币");
}
}
public class HasCoinState implements VendingMachineState {
private VendingMachine vendingMachine;
public HasCoinState(VendingMachine vendingMachine) {
this.vendingMachine = vendingMachine;
}
@Override
public void insertCoin() {
System.out.println("已经投币,请选择商品");
}
@Override
public void ejectCoin() {
System.out.println("退币成功");
vendingMachine.setState(vendingMachine.getNoCoinState());
}
@Override
public void selectProduct() {
System.out.println("选择商品成功");
vendingMachine.setState(vendingMachine.getSoldState());
}
@Override
public void dispense() {
System.out.println("请先选择商品");
}
}
public class SoldState implements VendingMachineState {
private VendingMachine vendingMachine;
public SoldState(VendingMachine vendingMachine) {
this.vendingMachine = vendingMachine;
}
@Override
public void insertCoin() {
System.out.println("请等待商品出货");
}
@Override
public void ejectCoin() {
System.out.println("商品已选择,无法退币");
}
@Override
public void selectProduct() {
System.out.println("商品已选择,请等待出货");
}
@Override
public void dispense() {
System.out.println("商品出货");
vendingMachine.releaseProduct();
if (vendingMachine.getCount() > 0) {
vendingMachine.setState(vendingMachine.getNoCoinState());
} else {
vendingMachine.setState(vendingMachine.getSoldOutState());
}
}
}
public class SoldOutState implements VendingMachineState {
private VendingMachine vendingMachine;
public SoldOutState(VendingMachine vendingMachine) {
this.vendingMachine = vendingMachine;
}
@Override
public void insertCoin() {
System.out.println("商品已售罄,无法投币");
}
@Override
public void ejectCoin() {
System.out.println("没有投币,无法退币");
}
@Override
public void selectProduct() {
System.out.println("商品已售罄");
}
@Override
public void dispense() {
System.out.println("商品已售罄");
}
}
public class VendingMachine {
private VendingMachineState noCoinState;
private VendingMachineState hasCoinState;
private VendingMachineState soldState;
private VendingMachineState soldOutState;
private VendingMachineState currentState;
private int count = 0;
public VendingMachine(int count) {
noCoinState = new NoCoinState(this);
hasCoinState = new HasCoinState(this);
soldState = new SoldState(this);
soldOutState = new SoldOutState(this);
this.count = count;
if (count > 0) {
currentState = noCoinState;
} else {
currentState = soldOutState;
}
}
public void insertCoin() {
currentState.insertCoin();
}
public void ejectCoin() {
currentState.ejectCoin();
}
public void selectProduct() {
currentState.selectProduct();
}
public void dispense() {
currentState.dispense();
}
public void setState(VendingMachineState state) {
currentState = state;
}
public void releaseProduct() {
System.out.println("商品从售货机中出来");
count--;
}
public int getCount() {
return count;
}
// Getter methods for states
public VendingMachineState getNoCoinState() {
return noCoinState;
}
public VendingMachineState getHasCoinState() {
return hasCoinState;
}
public VendingMachineState getSoldState() {
return soldState;
}
public VendingMachineState getSoldOutState() {
return soldOutState;
}
}
状态枚举实现:
typescript
// 状态枚举:使用枚举简化状态管理
public enum OrderState {
PENDING {
@Override
public void process(Order order) {
System.out.println("订单待处理,开始处理...");
order.setState(PROCESSING);
}
@Override
public void cancel(Order order) {
System.out.println("订单取消");
order.setState(CANCELLED);
}
@Override
public void ship(Order order) {
System.out.println("订单还未处理,无法发货");
}
@Override
public void deliver(Order order) {
System.out.println("订单还未发货,无法交付");
}
},
PROCESSING {
@Override
public void process(Order order) {
System.out.println("订单正在处理中...");
}
@Override
public void cancel(Order order) {
System.out.println("订单处理中,无法取消");
}
@Override
public void ship(Order order) {
System.out.println("订单处理完成,开始发货");
order.setState(SHIPPED);
}
@Override
public void deliver(Order order) {
System.out.println("订单还未发货,无法交付");
}
},
SHIPPED {
@Override
public void process(Order order) {
System.out.println("订单已发货,无法重新处理");
}
@Override
public void cancel(Order order) {
System.out.println("订单已发货,无法取消");
}
@Override
public void ship(Order order) {
System.out.println("订单已发货");
}
@Override
public void deliver(Order order) {
System.out.println("订单交付完成");
order.setState(DELIVERED);
}
},
DELIVERED {
@Override
public void process(Order order) {
System.out.println("订单已交付,无法重新处理");
}
@Override
public void cancel(Order order) {
System.out.println("订单已交付,无法取消");
}
@Override
public void ship(Order order) {
System.out.println("订单已交付,无法重新发货");
}
@Override
public void deliver(Order order) {
System.out.println("订单已交付");
}
},
CANCELLED {
@Override
public void process(Order order) {
System.out.println("订单已取消,无法处理");
}
@Override
public void cancel(Order order) {
System.out.println("订单已取消");
}
@Override
public void ship(Order order) {
System.out.println("订单已取消,无法发货");
}
@Override
public void deliver(Order order) {
System.out.println("订单已取消,无法交付");
}
};
public abstract void process(Order order);
public abstract void cancel(Order order);
public abstract void ship(Order order);
public abstract void deliver(Order order);
}
public class Order {
private String orderId;
private OrderState state;
public Order(String orderId) {
this.orderId = orderId;
this.state = OrderState.PENDING;
}
public void process() {
state.process(this);
}
public void cancel() {
state.cancel(this);
}
public void ship() {
state.ship(this);
}
public void deliver() {
state.deliver(this);
}
public void setState(OrderState state) {
this.state = state;
}
public OrderState getState() {
return state;
}
public String getOrderId() {
return orderId;
}
}
4.2.3 ⚙️ 状态机实现
csharp
// 状态机:复杂状态转换逻辑
public class StateMachine<T> {
private T currentState;
private Map<T, Map<String, T>> transitions = new HashMap<>();
private Map<T, Map<String, Runnable>> actions = new HashMap<>();
public StateMachine(T initialState) {
this.currentState = initialState;
}
public void addTransition(T fromState, String event, T toState) {
transitions.computeIfAbsent(fromState, k -> new HashMap<>()).put(event, toState);
}
public void addAction(T state, String event, Runnable action) {
actions.computeIfAbsent(state, k -> new HashMap<>()).put(event, action);
}
public boolean fire(String event) {
Map<String, T> stateTransitions = transitions.get(currentState);
if (stateTransitions != null && stateTransitions.containsKey(event)) {
// 执行当前状态的退出动作
executeAction(currentState, "exit");
// 执行事件动作
executeAction(currentState, event);
// 转换状态
T newState = stateTransitions.get(event);
currentState = newState;
// 执行新状态的进入动作
executeAction(currentState, "enter");
return true;
}
return false;
}
private void executeAction(T state, String event) {
Map<String, Runnable> stateActions = actions.get(state);
if (stateActions != null) {
Runnable action = stateActions.get(event);
if (action != null) {
action.run();
}
}
}
public T getCurrentState() {
return currentState;
}
}
// 使用状态机的游戏角色状态管理
public enum GameState {
IDLE, WALKING, RUNNING, JUMPING, ATTACKING, DEFENDING, DEAD
}
public class GameCharacter {
private String name;
private StateMachine<GameState> stateMachine;
public GameCharacter(String name) {
this.name = name;
this.stateMachine = new StateMachine<>(GameState.IDLE);
setupStateMachine();
}
private void setupStateMachine() {
// 定义状态转换
stateMachine.addTransition(GameState.IDLE, "walk", GameState.WALKING);
stateMachine.addTransition(GameState.IDLE, "run", GameState.RUNNING);
stateMachine.addTransition(GameState.IDLE, "jump", GameState.JUMPING);
stateMachine.addTransition(GameState.IDLE, "attack", GameState.ATTACKING);
stateMachine.addTransition(GameState.IDLE, "defend", GameState.DEFENDING);
stateMachine.addTransition(GameState.WALKING, "stop", GameState.IDLE);
stateMachine.addTransition(GameState.WALKING, "run", GameState.RUNNING);
stateMachine.addTransition(GameState.WALKING, "jump", GameState.JUMPING);
stateMachine.addTransition(GameState.RUNNING, "stop", GameState.IDLE);
stateMachine.addTransition(GameState.RUNNING, "walk", GameState.WALKING);
stateMachine.addTransition(GameState.RUNNING, "jump", GameState.JUMPING);
stateMachine.addTransition(GameState.JUMPING, "land", GameState.IDLE);
stateMachine.addTransition(GameState.JUMPING, "attack", GameState.ATTACKING);
stateMachine.addTransition(GameState.ATTACKING, "finish", GameState.IDLE);
stateMachine.addTransition(GameState.ATTACKING, "defend", GameState.DEFENDING);
stateMachine.addTransition(GameState.DEFENDING, "finish", GameState.IDLE);
stateMachine.addTransition(GameState.DEFENDING, "attack", GameState.ATTACKING);
// 所有状态都可以转换到死亡状态
for (GameState state : GameState.values()) {
if (state != GameState.DEAD) {
stateMachine.addTransition(state, "die", GameState.DEAD);
}
}
// 定义状态动作
stateMachine.addAction(GameState.IDLE, "enter", () -> System.out.println(name + " 进入待机状态"));
stateMachine.addAction(GameState.WALKING, "enter", () -> System.out.println(name + " 开始行走"));
stateMachine.addAction(GameState.RUNNING, "enter", () -> System.out.println(name + " 开始奔跑"));
stateMachine.addAction(GameState.JUMPING, "enter", () -> System.out.println(name + " 开始跳跃"));
stateMachine.addAction(GameState.ATTACKING, "enter", () -> System.out.println(name + " 开始攻击"));
stateMachine.addAction(GameState.DEFENDING, "enter", () -> System.out.println(name + " 开始防御"));
stateMachine.addAction(GameState.DEAD, "enter", () -> System.out.println(name + " 死亡"));
}
public void walk() {
stateMachine.fire("walk");
}
public void run() {
stateMachine.fire("run");
}
public void jump() {
stateMachine.fire("jump");
}
public void attack() {
stateMachine.fire("attack");
}
public void defend() {
stateMachine.fire("defend");
}
public void stop() {
stateMachine.fire("stop");
}
public void land() {
stateMachine.fire("land");
}
public void finish() {
stateMachine.fire("finish");
}
public void die() {
stateMachine.fire("die");
}
public GameState getCurrentState() {
return stateMachine.getCurrentState();
}
}
4.2.3 🎯 标准实现示例
csharp
// 状态接口 - 定义状态的行为
public interface State {
void handle();
}
// 具体状态A - 实现状态A的行为
public class ConcreteStateA implements State {
private Context context;
public ConcreteStateA(Context context) {
this.context = context;
}
@Override
public void handle() {
System.out.println("状态A的处理");
context.setState(new ConcreteStateB(context));
}
}
// 具体状态B - 实现状态B的行为
public class ConcreteStateB implements State {
private Context context;
public ConcreteStateB(Context context) {
this.context = context;
}
@Override
public void handle() {
System.out.println("状态B的处理");
context.setState(new ConcreteStateA(context));
}
}
// 上下文 - 维护当前状态的对象
public class Context {
private State state;
public Context() {
state = new ConcreteStateA(this);
}
public void setState(State state) {
this.state = state;
}
public void request() {
state.handle();
}
}
4.2.4 🎯 实际应用示例
csharp
// 售货机状态接口
public interface VendingMachineState {
void insertCoin();
void ejectCoin();
void selectProduct();
void dispense();
}
// 无币状态
public class NoCoinState implements VendingMachineState {
private VendingMachine vendingMachine;
public NoCoinState(VendingMachine vendingMachine) {
this.vendingMachine = vendingMachine;
}
@Override
public void insertCoin() {
System.out.println("投币成功");
vendingMachine.setState(vendingMachine.getHasCoinState());
}
@Override
public void ejectCoin() {
System.out.println("没有投币,无法退币");
}
@Override
public void selectProduct() {
System.out.println("请先投币");
}
@Override
public void dispense() {
System.out.println("请先投币");
}
}
// 有币状态
public class HasCoinState implements VendingMachineState {
private VendingMachine vendingMachine;
public HasCoinState(VendingMachine vendingMachine) {
this.vendingMachine = vendingMachine;
}
@Override
public void insertCoin() {
System.out.println("已经投币,请选择商品");
}
@Override
public void ejectCoin() {
System.out.println("退币成功");
vendingMachine.setState(vendingMachine.getNoCoinState());
}
@Override
public void selectProduct() {
System.out.println("选择商品成功");
vendingMachine.setState(vendingMachine.getSoldState());
}
@Override
public void dispense() {
System.out.println("请先选择商品");
}
}
// 自动售货机
public class VendingMachine {
private VendingMachineState noCoinState;
private VendingMachineState hasCoinState;
private VendingMachineState soldState;
private VendingMachineState currentState;
public VendingMachine() {
noCoinState = new NoCoinState(this);
hasCoinState = new HasCoinState(this);
soldState = new SoldState(this);
currentState = noCoinState;
}
public void insertCoin() {
currentState.insertCoin();
}
public void ejectCoin() {
currentState.ejectCoin();
}
public void selectProduct() {
currentState.selectProduct();
}
public void dispense() {
currentState.dispense();
}
public void setState(VendingMachineState state) {
currentState = state;
}
public VendingMachineState getNoCoinState() {
return noCoinState;
}
public VendingMachineState getHasCoinState() {
return hasCoinState;
}
public VendingMachineState getSoldState() {
return soldState;
}
}
📋 第五部分:模板方法模式(Template Method Pattern)
arduino
📋 模板舞者的登场 📋
┌─────────────────────────────────────┐
│ 📋 模板者:我是算法框架设计师! │
│ │
│ 🍵 咖啡:"我要冲泡咖啡!" │
│ 📋 模板者:"我来定义框架!" │
│ 🍵 茶:"我要冲泡茶!" │
│ 📋 模板者:"继续定义框架!" │
│ │
│ 💡 核心思想:算法骨架固定 │
└─────────────────────────────────────┘
🏗️ 模板方法模式UML类图

5.1 🎭 什么是模板方法模式?
一句话理解:定义算法骨架,让子类实现具体步骤,就像制作饮料的模板!
定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
应用场景:算法框架、代码复用、钩子方法、流程控制
5.2 🛠️ 模板方法模式的实现
5.2.1 🏗️ 基本结构
💡 小贴士:模板方法模式就像烹饪菜谱,定义了步骤框架,具体实现可以灵活变化!
核心组件:
- AbstractClass(抽象类) :定义算法框架
- ConcreteClass(具体类) :实现具体步骤
- Template Method(模板方法) :定义算法骨架
5.2.2 🚀 多种实现方式
实现方式 | 特点 | 推荐度 |
---|---|---|
抽象类 | 通过抽象类定义模板 | ⭐⭐⭐⭐⭐ |
钩子方法 | 提供默认实现的可选方法 | ⭐⭐⭐⭐⭐ |
算法骨架 | 固定算法流程,可变步骤 | ⭐⭐⭐⭐⭐ |
5.2.1 🏗️ 抽象类实现
csharp
// 抽象类:通过抽象类定义模板
public abstract class DataProcessor {
// 模板方法,定义算法骨架
public final void process() {
readData();
processData();
writeData();
cleanup();
}
// 抽象方法,子类必须实现
protected abstract void readData();
protected abstract void processData();
protected abstract void writeData();
// 具体方法,所有子类共享
protected void cleanup() {
System.out.println("清理资源");
}
}
public class CSVProcessor extends DataProcessor {
@Override
protected void readData() {
System.out.println("读取CSV文件");
}
@Override
protected void processData() {
System.out.println("处理CSV数据");
}
@Override
protected void writeData() {
System.out.println("写入CSV文件");
}
}
public class JSONProcessor extends DataProcessor {
@Override
protected void readData() {
System.out.println("读取JSON文件");
}
@Override
protected void processData() {
System.out.println("处理JSON数据");
}
@Override
protected void writeData() {
System.out.println("写入JSON文件");
}
}
public class XMLProcessor extends DataProcessor {
@Override
protected void readData() {
System.out.println("读取XML文件");
}
@Override
protected void processData() {
System.out.println("处理XML数据");
}
@Override
protected void writeData() {
System.out.println("写入XML文件");
}
}
5.2.2 🎣 钩子方法实现
typescript
// 钩子方法:提供默认实现的可选方法
public abstract class BeverageWithHooks {
// 模板方法
public final void prepareBeverage() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) {
addCondiments();
}
if (customerWantsIce()) {
addIce();
}
if (customerWantsSugar()) {
addSugar();
}
}
// 抽象方法
protected abstract void brew();
protected abstract void addCondiments();
// 具体方法
protected void boilWater() {
System.out.println("烧开水");
}
protected void pourInCup() {
System.out.println("倒入杯中");
}
// 钩子方法 - 默认实现
protected boolean customerWantsCondiments() {
return true; // 默认需要调味品
}
protected boolean customerWantsIce() {
return false; // 默认不需要冰
}
protected boolean customerWantsSugar() {
return true; // 默认需要糖
}
protected void addIce() {
System.out.println("加入冰块");
}
protected void addSugar() {
System.out.println("加入糖");
}
}
public class CoffeeWithHooks extends BeverageWithHooks {
private boolean wantsCondiments = true;
private boolean wantsIce = false;
private boolean wantsSugar = true;
public void setWantsCondiments(boolean wantsCondiments) {
this.wantsCondiments = wantsCondiments;
}
public void setWantsIce(boolean wantsIce) {
this.wantsIce = wantsIce;
}
public void setWantsSugar(boolean wantsSugar) {
this.wantsSugar = wantsSugar;
}
@Override
protected void brew() {
System.out.println("用沸水冲泡咖啡");
}
@Override
protected void addCondiments() {
System.out.println("加入牛奶");
}
@Override
protected boolean customerWantsCondiments() {
return wantsCondiments;
}
@Override
protected boolean customerWantsIce() {
return wantsIce;
}
@Override
protected boolean customerWantsSugar() {
return wantsSugar;
}
}
public class TeaWithHooks extends BeverageWithHooks {
private boolean wantsLemon = true;
public void setWantsLemon(boolean wantsLemon) {
this.wantsLemon = wantsLemon;
}
@Override
protected void brew() {
System.out.println("用沸水浸泡茶叶");
}
@Override
protected void addCondiments() {
if (wantsLemon) {
System.out.println("加入柠檬");
}
}
@Override
protected boolean customerWantsCondiments() {
return wantsLemon;
}
@Override
protected boolean customerWantsSugar() {
return false; // 茶通常不需要糖
}
}
5.2.3 🔄 算法骨架实现
csharp
// 算法骨架:固定算法流程,可变步骤
public abstract class AlgorithmSkeleton {
// 模板方法,定义算法骨架
public final void execute() {
initialize();
preprocess();
executeCore();
postprocess();
cleanup();
}
// 抽象方法,子类必须实现
protected abstract void initialize();
protected abstract void executeCore();
// 钩子方法,子类可以选择覆盖
protected void preprocess() {
System.out.println("默认预处理");
}
protected void postprocess() {
System.out.println("默认后处理");
}
protected void cleanup() {
System.out.println("默认清理");
}
// 具体方法,所有子类共享
protected void log(String message) {
System.out.println("日志: " + message);
}
protected void validate() {
System.out.println("验证数据");
}
}
public class SortingAlgorithm extends AlgorithmSkeleton {
private int[] data;
public SortingAlgorithm(int[] data) {
this.data = data;
}
@Override
protected void initialize() {
log("初始化排序算法");
validate();
}
@Override
protected void executeCore() {
log("执行排序");
Arrays.sort(data);
}
@Override
protected void postprocess() {
log("排序完成,结果: " + Arrays.toString(data));
}
}
public class SearchAlgorithm extends AlgorithmSkeleton {
private int[] data;
private int target;
public SearchAlgorithm(int[] data, int target) {
this.data = data;
this.target = target;
}
@Override
protected void initialize() {
log("初始化搜索算法");
validate();
}
@Override
protected void preprocess() {
log("预处理:对数据进行排序");
Arrays.sort(data);
}
@Override
protected void executeCore() {
log("执行二分搜索");
int result = Arrays.binarySearch(data, target);
if (result >= 0) {
log("找到目标值,位置: " + result);
} else {
log("未找到目标值");
}
}
@Override
protected void cleanup() {
log("清理搜索资源");
}
}
public class CompressionAlgorithm extends AlgorithmSkeleton {
private byte[] data;
public CompressionAlgorithm(byte[] data) {
this.data = data;
}
@Override
protected void initialize() {
log("初始化压缩算法");
validate();
}
@Override
protected void executeCore() {
log("执行数据压缩");
// 模拟压缩过程
System.out.println("压缩前大小: " + data.length + " 字节");
System.out.println("压缩后大小: " + (data.length / 2) + " 字节");
}
@Override
protected void postprocess() {
log("压缩完成,计算压缩率");
System.out.println("压缩率: 50%");
}
}
5.2.3 🎯 标准实现示例
csharp
// 抽象类 - 定义算法骨架
public abstract class AbstractClass {
// 模板方法 - 定义算法流程
public final void templateMethod() {
primitiveOperation1();
primitiveOperation2();
concreteOperation();
hook();
}
// 抽象方法 - 子类必须实现
protected abstract void primitiveOperation1();
protected abstract void primitiveOperation2();
// 具体方法 - 所有子类共享
protected void concreteOperation() {
System.out.println("具体操作");
}
// 钩子方法 - 子类可选覆盖
protected void hook() {
// 默认实现,子类可以覆盖
}
}
// 具体类A - 实现具体步骤
public class ConcreteClassA extends AbstractClass {
@Override
protected void primitiveOperation1() {
System.out.println("具体类A的操作1");
}
@Override
protected void primitiveOperation2() {
System.out.println("具体类A的操作2");
}
}
// 具体类B - 实现具体步骤并覆盖钩子方法
public class ConcreteClassB extends AbstractClass {
@Override
protected void primitiveOperation1() {
System.out.println("具体类B的操作1");
}
@Override
protected void primitiveOperation2() {
System.out.println("具体类B的操作2");
}
@Override
protected void hook() {
System.out.println("具体类B的钩子方法");
}
}
5.2.4 🎯 实际应用示例
csharp
// 饮料抽象类
public abstract class Beverage {
// 模板方法
public final void prepareBeverage() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) {
addCondiments();
}
}
// 抽象方法
protected abstract void brew();
protected abstract void addCondiments();
// 具体方法
protected void boilWater() {
System.out.println("烧开水");
}
protected void pourInCup() {
System.out.println("倒入杯中");
}
// 钩子方法
protected boolean customerWantsCondiments() {
return true;
}
}
// 咖啡
public class Coffee extends Beverage {
@Override
protected void brew() {
System.out.println("用沸水冲泡咖啡");
}
@Override
protected void addCondiments() {
System.out.println("加入糖和牛奶");
}
}
// 茶
public class Tea extends Beverage {
private boolean wantsCondiments = true;
public void setWantsCondiments(boolean wantsCondiments) {
this.wantsCondiments = wantsCondiments;
}
@Override
protected void brew() {
System.out.println("用沸水浸泡茶叶");
}
@Override
protected void addCondiments() {
System.out.println("加入柠檬");
}
@Override
protected boolean customerWantsCondiments() {
return wantsCondiments;
}
}
🔍 第六部分:迭代器模式(Iterator Pattern)
arduino
🔍 迭代舞者的登场 🔍
┌─────────────────────────────────────┐
│ 🔍 迭代者:我是集合遍历专家! │
│ │
│ 📚 书架:"我有好多书!" │
│ 🔍 迭代者:"我来遍历它们!" │
│ 📚 书架:"我有不同结构!" │
│ 🔍 迭代者:"继续遍历它们!" │
│ │
│ 💡 核心思想:统一遍历接口 │
└─────────────────────────────────────┘
🏗️ 迭代器模式UML类图

6.1 🎭 什么是迭代器模式?
一句话理解:提供统一的接口来遍历集合,隐藏内部结构!
定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
应用场景:集合遍历、数据结构访问、分页查询、数据库结果集
6.2 🛠️ 迭代器模式的实现
6.2.1 🏗️ 基本结构
💡 小贴士:迭代器模式就像图书馆的图书管理员,统一管理各种书籍的访问方式!
核心组件:
- Iterator(迭代器) :定义访问元素的接口
- ConcreteIterator(具体迭代器) :实现迭代器接口
- Aggregate(聚合) :定义创建迭代器的接口
- ConcreteAggregate(具体聚合) :实现聚合接口
6.2.2 🚀 多种实现方式
实现方式 | 特点 | 推荐度 |
---|---|---|
外部迭代器 | 客户端控制迭代过程 | ⭐⭐⭐⭐ |
内部迭代器 | 聚合对象控制迭代过程 | ⭐⭐⭐ |
泛型迭代器 | 支持不同类型的元素 | ⭐⭐⭐⭐⭐ |
外部迭代器实现:
csharp
// 外部迭代器:客户端控制迭代过程
public interface ExternalIterator<T> {
boolean hasNext();
T next();
void remove();
}
public interface ExternalAggregate<T> {
ExternalIterator<T> createIterator();
}
public class BookShelf implements ExternalAggregate<Book> {
private List<Book> books = new ArrayList<>();
public void appendBook(Book book) {
books.add(book);
}
public Book getBookAt(int index) {
return books.get(index);
}
public int getLength() {
return books.size();
}
@Override
public ExternalIterator<Book> createIterator() {
return new BookShelfIterator(this);
}
}
public class BookShelfIterator implements ExternalIterator<Book> {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
@Override
public boolean hasNext() {
return index < bookShelf.getLength();
}
@Override
public Book next() {
if (hasNext()) {
return bookShelf.getBookAt(index++);
}
throw new NoSuchElementException();
}
@Override
public void remove() {
// 实现删除逻辑
throw new UnsupportedOperationException("不支持删除操作");
}
}
public class Book {
private String name;
private String author;
public Book(String name, String author) {
this.name = name;
this.author = author;
}
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
@Override
public String toString() {
return "《" + name + "》 by " + author;
}
}
6.2.2 🔄 内部迭代器实现
csharp
// 内部迭代器:聚合对象控制迭代过程
public interface InternalIterator<T> {
void iterate(Consumer<T> action);
}
public class BookShelfInternal implements InternalIterator<Book> {
private List<Book> books = new ArrayList<>();
public void appendBook(Book book) {
books.add(book);
}
@Override
public void iterate(Consumer<Book> action) {
for (Book book : books) {
action.accept(book);
}
}
// 提供过滤功能
public void iterateWithFilter(Predicate<Book> filter, Consumer<Book> action) {
for (Book book : books) {
if (filter.test(book)) {
action.accept(book);
}
}
}
// 提供转换功能
public <R> List<R> map(Function<Book, R> mapper) {
List<R> result = new ArrayList<>();
for (Book book : books) {
result.add(mapper.apply(book));
}
return result;
}
}
// 使用示例
public class InternalIteratorDemo {
public static void main(String[] args) {
BookShelfInternal shelf = new BookShelfInternal();
shelf.appendBook(new Book("Java编程思想", "Bruce Eckel"));
shelf.appendBook(new Book("设计模式", "GoF"));
shelf.appendBook(new Book("算法导论", "Thomas H. Cormen"));
// 简单迭代
System.out.println("=== 所有书籍 ===");
shelf.iterate(book -> System.out.println(book));
// 过滤迭代
System.out.println("\n=== Java相关书籍 ===");
shelf.iterateWithFilter(
book -> book.getName().contains("Java"),
book -> System.out.println(book)
);
// 转换迭代
System.out.println("\n=== 书籍名称列表 ===");
List<String> bookNames = shelf.map(Book::getName);
bookNames.forEach(System.out::println);
}
}
泛型迭代器实现:
csharp
// 泛型迭代器:支持不同类型的元素
public interface GenericIterator<T> {
boolean hasNext();
T next();
void remove();
void reset();
}
public interface GenericAggregate<T> {
GenericIterator<T> createIterator();
int size();
T get(int index);
void add(T element);
void remove(T element);
}
public class GenericList<T> implements GenericAggregate<T> {
private List<T> elements = new ArrayList<>();
@Override
public GenericIterator<T> createIterator() {
return new GenericListIterator<>(this);
}
@Override
public int size() {
return elements.size();
}
@Override
public T get(int index) {
return elements.get(index);
}
@Override
public void add(T element) {
elements.add(element);
}
@Override
public void remove(T element) {
elements.remove(element);
}
}
public class GenericListIterator<T> implements GenericIterator<T> {
private GenericAggregate<T> aggregate;
private int currentIndex;
public GenericListIterator(GenericAggregate<T> aggregate) {
this.aggregate = aggregate;
this.currentIndex = 0;
}
@Override
public boolean hasNext() {
return currentIndex < aggregate.size();
}
@Override
public T next() {
if (hasNext()) {
return aggregate.get(currentIndex++);
}
throw new NoSuchElementException();
}
@Override
public void remove() {
// 实现删除逻辑
throw new UnsupportedOperationException("不支持删除操作");
}
@Override
public void reset() {
currentIndex = 0;
}
}
// 双向迭代器
public interface BidirectionalIterator<T> extends GenericIterator<T> {
boolean hasPrevious();
T previous();
int nextIndex();
int previousIndex();
}
public class BidirectionalListIterator<T> implements BidirectionalIterator<T> {
private GenericAggregate<T> aggregate;
private int currentIndex;
public BidirectionalListIterator(GenericAggregate<T> aggregate) {
this.aggregate = aggregate;
this.currentIndex = 0;
}
@Override
public boolean hasNext() {
return currentIndex < aggregate.size();
}
@Override
public T next() {
if (hasNext()) {
return aggregate.get(currentIndex++);
}
throw new NoSuchElementException();
}
@Override
public boolean hasPrevious() {
return currentIndex > 0;
}
@Override
public T previous() {
if (hasPrevious()) {
return aggregate.get(--currentIndex);
}
throw new NoSuchElementException();
}
@Override
public int nextIndex() {
return currentIndex;
}
@Override
public int previousIndex() {
return currentIndex - 1;
}
@Override
public void remove() {
throw new UnsupportedOperationException("不支持删除操作");
}
@Override
public void reset() {
currentIndex = 0;
}
}
// 使用示例
public class GenericIteratorDemo {
public static void main(String[] args) {
// 字符串列表
GenericList<String> stringList = new GenericList<>();
stringList.add("Apple");
stringList.add("Banana");
stringList.add("Cherry");
System.out.println("=== 字符串列表 ===");
GenericIterator<String> stringIterator = stringList.createIterator();
while (stringIterator.hasNext()) {
System.out.println(stringIterator.next());
}
// 整数列表
GenericList<Integer> intList = new GenericList<>();
intList.add(1);
intList.add(2);
intList.add(3);
intList.add(4);
intList.add(5);
System.out.println("\n=== 整数列表 ===");
GenericIterator<Integer> intIterator = intList.createIterator();
while (intIterator.hasNext()) {
System.out.println(intIterator.next());
}
// 双向迭代
System.out.println("\n=== 双向迭代 ===");
BidirectionalIterator<Integer> biIterator = new BidirectionalListIterator<>(intList);
while (biIterator.hasNext()) {
System.out.println("前进: " + biIterator.next());
}
while (biIterator.hasPrevious()) {
System.out.println("后退: " + biIterator.previous());
}
}
}
6.2.3 🎯 标准实现示例
csharp
// 迭代器接口 - 定义遍历操作
public interface Iterator<T> {
boolean hasNext();
T next();
void remove();
}
// 聚合接口 - 定义创建迭代器的方法
public interface Aggregate<T> {
Iterator<T> createIterator();
}
// 具体聚合 - 实现聚合接口
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> items = new ArrayList<>();
public void add(T item) {
items.add(item);
}
public T get(int index) {
return items.get(index);
}
public int size() {
return items.size();
}
@Override
public Iterator<T> createIterator() {
return new ConcreteIterator<>(this);
}
}
// 具体迭代器 - 实现遍历逻辑
public class ConcreteIterator<T> implements Iterator<T> {
private ConcreteAggregate<T> aggregate;
private int current = 0;
public ConcreteIterator(ConcreteAggregate<T> aggregate) {
this.aggregate = aggregate;
}
@Override
public boolean hasNext() {
return current < aggregate.size();
}
@Override
public T next() {
if (hasNext()) {
return aggregate.get(current++);
}
throw new NoSuchElementException();
}
@Override
public void remove() {
// 实现删除逻辑
}
}
6.2.4 🎯 实际应用示例
typescript
// 书类
public class Book {
private String name;
private String author;
public Book(String name, String author) {
this.name = name;
this.author = author;
}
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
@Override
public String toString() {
return "《" + name + "》 by " + author;
}
}
// 书架
public class BookShelf implements Aggregate<Book> {
private List<Book> books = new ArrayList<>();
public void appendBook(Book book) {
books.add(book);
}
public Book getBookAt(int index) {
return books.get(index);
}
public int getLength() {
return books.size();
}
@Override
public Iterator<Book> createIterator() {
return new BookShelfIterator(this);
}
}
// 书架迭代器
public class BookShelfIterator implements Iterator<Book> {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
@Override
public boolean hasNext() {
return index < bookShelf.getLength();
}
@Override
public Book next() {
if (hasNext()) {
return bookShelf.getBookAt(index++);
}
throw new NoSuchElementException();
}
@Override
public void remove() {
// 实现删除逻辑
}
}
⛓️ 第七部分:责任链模式(Chain of Responsibility Pattern)
arduino
⛓️ 责任链舞者的登场 ⛓️
┌─────────────────────────────────────┐
│ ⛓️ 责任链:我是请求处理链! │
│ │
│ 📝 请求:"我要请假3天!" │
│ ⛓️ 责任链:"我来传递请求!" │
│ 📝 请求:"我要请假10天!" │
│ ⛓️ 责任链:"继续传递请求!" │
│ │
│ 💡 核心思想:请求沿链传递 │
└─────────────────────────────────────┘
🏗️ 责任链模式UML类图

7.1 🎭 什么是责任链模式?
一句话理解:请求沿着处理链传递,直到找到合适的处理器!
定义:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。
应用场景:请求处理、异常处理、过滤器链、审批流程、日志处理
7.2 🛠️ 责任链模式的实现
7.2.1 🏗️ 基本结构
💡 小贴士:责任链模式就像公司审批流程,请求沿着链条传递,直到被处理!
核心组件:
- Handler(处理器) :定义处理请求的接口
- ConcreteHandler(具体处理器) :实现处理器接口
- Client(客户端) :发起请求的对象
7.2.2 🚀 多种实现方式
实现方式 | 特点 | 推荐度 |
---|---|---|
纯责任链 | 请求必须被处理 | ⭐⭐⭐⭐ |
不纯责任链 | 请求可能不被处理 | ⭐⭐⭐ |
动态责任链 | 运行时动态构建链 | ⭐⭐⭐⭐⭐ |
7.2.1 ⛓️ 纯责任链实现
java
// 纯责任链:请求必须被处理
public abstract class PureHandler {
protected PureHandler successor;
public void setSuccessor(PureHandler successor) {
this.successor = successor;
}
public abstract void handleRequest(int request);
}
public class ConcreteHandlerA extends PureHandler {
@Override
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("处理器A处理请求: " + request);
} else if (successor != null) {
successor.handleRequest(request);
} else {
// 纯责任链:必须有处理器处理请求
System.out.println("默认处理器处理请求: " + request);
}
}
}
public class ConcreteHandlerB extends PureHandler {
@Override
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("处理器B处理请求: " + request);
} else if (successor != null) {
successor.handleRequest(request);
} else {
System.out.println("默认处理器处理请求: " + request);
}
}
}
public class ConcreteHandlerC extends PureHandler {
@Override
public void handleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println("处理器C处理请求: " + request);
} else if (successor != null) {
successor.handleRequest(request);
} else {
System.out.println("默认处理器处理请求: " + request);
}
}
}
public class DefaultHandler extends PureHandler {
@Override
public void handleRequest(int request) {
System.out.println("默认处理器处理请求: " + request);
}
}
不纯责任链实现:
kotlin
// 不纯责任链:请求可能不被处理
public abstract class ImpureHandler {
protected ImpureHandler successor;
public void setSuccessor(ImpureHandler successor) {
this.successor = successor;
}
public abstract boolean handleRequest(int request);
}
public class ImpureHandlerA extends ImpureHandler {
@Override
public boolean handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("处理器A处理请求: " + request);
return true; // 请求被处理
} else if (successor != null) {
return successor.handleRequest(request);
} else {
System.out.println("请求未被处理: " + request);
return false; // 请求未被处理
}
}
}
public class ImpureHandlerB extends ImpureHandler {
@Override
public boolean handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("处理器B处理请求: " + request);
return true;
} else if (successor != null) {
return successor.handleRequest(request);
} else {
System.out.println("请求未被处理: " + request);
return false;
}
}
}
public class ImpureHandlerC extends ImpureHandler {
@Override
public boolean handleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println("处理器C处理请求: " + request);
return true;
} else if (successor != null) {
return successor.handleRequest(request);
} else {
System.out.println("请求未被处理: " + request);
return false;
}
}
}
动态责任链实现:
typescript
// 动态责任链:运行时动态构建链
public interface DynamicHandler {
boolean handle(Request request);
void setNext(DynamicHandler next);
DynamicHandler getNext();
}
public class Request {
private String type;
private Object data;
private Map<String, Object> context = new HashMap<>();
public Request(String type, Object data) {
this.type = type;
this.data = data;
}
public String getType() {
return type;
}
public Object getData() {
return data;
}
public void setContext(String key, Object value) {
context.put(key, value);
}
public Object getContext(String key) {
return context.get(key);
}
}
public class AuthenticationHandler implements DynamicHandler {
private DynamicHandler next;
@Override
public boolean handle(Request request) {
System.out.println("认证处理器处理请求: " + request.getType());
// 模拟认证逻辑
if ("admin".equals(request.getContext("user"))) {
request.setContext("authenticated", true);
System.out.println("认证成功");
return next != null ? next.handle(request) : true;
} else {
System.out.println("认证失败");
return false;
}
}
@Override
public void setNext(DynamicHandler next) {
this.next = next;
}
@Override
public DynamicHandler getNext() {
return next;
}
}
public class AuthorizationHandler implements DynamicHandler {
private DynamicHandler next;
@Override
public boolean handle(Request request) {
System.out.println("授权处理器处理请求: " + request.getType());
// 模拟授权逻辑
if (Boolean.TRUE.equals(request.getContext("authenticated"))) {
request.setContext("authorized", true);
System.out.println("授权成功");
return next != null ? next.handle(request) : true;
} else {
System.out.println("授权失败");
return false;
}
}
@Override
public void setNext(DynamicHandler next) {
this.next = next;
}
@Override
public DynamicHandler getNext() {
return next;
}
}
public class LoggingHandler implements DynamicHandler {
private DynamicHandler next;
@Override
public boolean handle(Request request) {
System.out.println("日志处理器处理请求: " + request.getType());
System.out.println("记录请求日志: " + request.getData());
boolean result = next != null ? next.handle(request) : true;
System.out.println("请求处理结果: " + result);
return result;
}
@Override
public void setNext(DynamicHandler next) {
this.next = next;
}
@Override
public DynamicHandler getNext() {
return next;
}
}
public class BusinessHandler implements DynamicHandler {
private DynamicHandler next;
@Override
public boolean handle(Request request) {
System.out.println("业务处理器处理请求: " + request.getType());
// 模拟业务逻辑
if (Boolean.TRUE.equals(request.getContext("authorized"))) {
System.out.println("执行业务逻辑: " + request.getData());
return true;
} else {
System.out.println("业务处理失败:未授权");
return false;
}
}
@Override
public void setNext(DynamicHandler next) {
this.next = next;
}
@Override
public DynamicHandler getNext() {
return next;
}
}
public class DynamicChainBuilder {
private List<DynamicHandler> handlers = new ArrayList<>();
public DynamicChainBuilder addHandler(DynamicHandler handler) {
handlers.add(handler);
return this;
}
public DynamicHandler build() {
if (handlers.isEmpty()) {
return null;
}
// 构建责任链
for (int i = 0; i < handlers.size() - 1; i++) {
handlers.get(i).setNext(handlers.get(i + 1));
}
return handlers.get(0);
}
}
// 使用示例
public class DynamicChainDemo {
public static void main(String[] args) {
// 动态构建责任链
DynamicChainBuilder builder = new DynamicChainBuilder();
DynamicHandler chain = builder
.addHandler(new LoggingHandler())
.addHandler(new AuthenticationHandler())
.addHandler(new AuthorizationHandler())
.addHandler(new BusinessHandler())
.build();
// 创建请求
Request request = new Request("userAction", "执行用户操作");
request.setContext("user", "admin");
// 处理请求
System.out.println("=== 处理请求 ===");
boolean result = chain.handle(request);
System.out.println("最终结果: " + result);
// 动态修改责任链
System.out.println("\n=== 动态修改责任链 ===");
DynamicChainBuilder newBuilder = new DynamicChainBuilder();
DynamicHandler newChain = newBuilder
.addHandler(new LoggingHandler())
.addHandler(new BusinessHandler())
.build();
Request newRequest = new Request("simpleAction", "简单操作");
boolean newResult = newChain.handle(newRequest);
System.out.println("新链处理结果: " + newResult);
}
}
7.2.3 🎯 标准实现示例
java
// 处理器抽象类 - 定义处理请求的接口
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(int request);
}
// 具体处理器A - 处理特定范围的请求
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("处理器A处理请求: " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 具体处理器B - 处理特定范围的请求
public class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("处理器B处理请求: " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 具体处理器C - 处理特定范围的请求
public class ConcreteHandlerC extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println("处理器C处理请求: " + request);
} else if (successor != null) {
successor.handleRequest(request);
} else {
System.out.println("没有处理器能处理请求: " + request);
}
}
}
7.2.4 🎯 实际应用示例
typescript
// 请假请求
public class LeaveRequest {
private String name;
private int leaveDays;
private String reason;
public LeaveRequest(String name, int leaveDays, String reason) {
this.name = name;
this.leaveDays = leaveDays;
this.reason = reason;
}
public String getName() {
return name;
}
public int getLeaveDays() {
return leaveDays;
}
public String getReason() {
return reason;
}
}
// 审批者抽象类
public abstract class Approver {
protected Approver successor;
protected String name;
public Approver(String name) {
this.name = name;
}
public void setSuccessor(Approver successor) {
this.successor = successor;
}
public abstract void processRequest(LeaveRequest request);
}
// 组长
public class GroupLeader extends Approver {
public GroupLeader(String name) {
super(name);
}
@Override
public void processRequest(LeaveRequest request) {
if (request.getLeaveDays() <= 3) {
System.out.println("组长 " + name + " 审批员工 " + request.getName() +
" 的请假申请,请假天数:" + request.getLeaveDays() + " 天");
} else if (successor != null) {
successor.processRequest(request);
}
}
}
// 经理
public class Manager extends Approver {
public Manager(String name) {
super(name);
}
@Override
public void processRequest(LeaveRequest request) {
if (request.getLeaveDays() <= 7) {
System.out.println("经理 " + name + " 审批员工 " + request.getName() +
" 的请假申请,请假天数:" + request.getLeaveDays() + " 天");
} else if (successor != null) {
successor.processRequest(request);
}
}
}
本文使用 markdown.com.cn 排版