用坦克大战原型演示“行为模式”

1.概要

2.内容

以下是23种设计模式中的11种行为模式,结合坦克场景的应用举例:

1. 策略模式(Strategy)

  • 场景:坦克移动策略选择。
  • 应用
    • 定义算法族:定义直线移动、曲线机动、规避障碍三种移动策略。
    • 上下文类:坦克根据战场环境(如开阔地、城市废墟)动态切换策略。
    • 优点:新增策略无需修改坦克类,符合开闭原则。
    • 代码示例

      interface MoveStrategy {
          void move(Tank tank);
      }
      class StraightMove implements MoveStrategy {
          public void move(Tank tank) { /* 直线移动逻辑 */ }
      }
      class Tank {
          private MoveStrategy strategy;
          public void setStrategy(MoveStrategy strategy) {
              this.strategy = strategy;
          }
          public void executeMove() {
              strategy.move(this);
          }
      }

2. 模板方法模式(Template Method)

  • 场景:坦克攻击流程标准化。
  • 应用
    • 抽象类:定义攻击流程(瞄准→装弹→射击)。
    • 具体子类:实现不同攻击方式(如穿甲弹、高爆弹)。
    • 钩子方法:允许子类决定是否启用自动瞄准。
    • 代码示例

      abstract class TankAttack {
          public final void attack() {
              aim();
              loadAmmo();
              fire();
          }
          protected abstract void aim();
          protected void loadAmmo() { /* 默认装弹逻辑 */ }
          protected abstract void fire();
      }
      class APShellAttack extends TankAttack {
          protected void aim() { /* 穿甲弹专用瞄准 */ }
          protected void fire() { /* 穿甲弹发射逻辑 */ }
      }

3. 观察者模式(Observer)

  • 场景:坦克状态实时监控。
  • 应用
    • 主题(Subject):坦克作为被观察对象,维护观察者列表。
    • 观察者(Observer):战场监控界面、指挥官终端等订阅坦克状态(血量、燃料、弹药)。
    • 通知机制:坦克状态变化时自动推送更新。
    • 代码示例

      class Tank extends Observable {
          private int health;
          public void setHealth(int health) {
              this.health = health;
              setChanged();
              notifyObservers(health);
          }
      }
      class CommanderTerminal implements Observer {
          public void update(Observable o, Object arg) {
              int health = (int) arg;
              System.out.println("当前坦克血量: " + health);
          }
      }

4. 迭代器模式(Iterator)

  • 场景:遍历坦克部件进行维护。
  • 应用
    • 聚合类:坦克包含多个部件(装甲、炮塔、发动机)。
    • 迭代器:提供统一接口遍历部件,隐藏内部结构。
    • 代码示例

      interface TankComponentIterator {
          boolean hasNext();
          Component next();
      }
      class Tank {
          private List<Component> components;
          public TankComponentIterator createIterator() {
              return new TankComponentIteratorImpl(components);
          }
      }
      class TankComponentIteratorImpl implements TankComponentIterator {
          private List<Component> components;
          private int currentIndex = 0;
          public boolean hasNext() { return currentIndex < components.size(); }
          public Component next() { return components.get(currentIndex++); }
      }

5. 责任链模式(Chain of Responsibility)

  • 场景:坦克命令处理优先级。
  • 应用
    • 处理者链:移动指令→攻击指令→防御指令,按优先级传递。
    • 动态调整:战场态势变化时可插入新处理节点(如紧急维修指令)。
    • 代码示例

      abstract class CommandHandler {
          private CommandHandler next;
          public void setNext(CommandHandler next) { this.next = next; }
          public final void handle(Command cmd) {
              if (canHandle(cmd)) {
                  execute(cmd);
              } else if (next != null) {
                  next.handle(cmd);
              }
          }
          protected abstract boolean canHandle(Command cmd);
          protected abstract void execute(Command cmd);
      }
      class MoveCommandHandler extends CommandHandler {
          protected boolean canHandle(Command cmd) { return cmd instanceof MoveCommand; }
          protected void execute(Command cmd) { /* 执行移动指令 */ }
      }

6. 命令模式(Command)

  • 场景:坦克行为指令封装。
  • 应用
    • 具体命令:前进、开火、停止等指令封装为对象。
    • 调用者:玩家或AI通过按钮触发命令。
    • 接收者:坦克执行具体动作。
    • 代码示例

      interface Command {
          void execute();
      }
      class FireCommand implements Command {
          private Tank tank;
          public FireCommand(Tank tank) { this.tank = tank; }
          public void execute() { tank.fire(); }
      }
      class Player {
          private List<Command> commands;
          public void trigger(Command cmd) {
              commands.add(cmd);
          }
          public void executeAll() {
              for (Command cmd : commands) {
                  cmd.execute();
              }
              commands.clear();
          }
      }

7. 备忘录模式(Memento)

  • 场景:坦克状态回溯(如撤销移动)。
  • 应用
    • 发起人:坦克保存自身状态(位置、方向、血量)。
    • 备忘录:存储状态快照。
    • 管理者:记录操作历史,支持回滚。
    • 代码示例

      class TankMemento {
          private int x, y;
          private Direction dir;
          private int health;
          // 构造方法、getter/setter省略
      }
      class Tank {
          public TankMemento saveState() {
              return new TankMemento(x, y, dir, health);
          }
          public void restoreState(TankMemento memento) {
              this.x = memento.getX();
              this.y = memento.getY();
              this.dir = memento.getDir();
              this.health = memento.getHealth();
          }
      }
      class HistoryManager {
          private Stack<TankMemento> history = new Stack<>();
          public void save(Tank tank) {
              history.push(tank.saveState());
          }
          public void undo(Tank tank) {
              if (!history.isEmpty()) {
                  TankMemento memento = history.pop();
                  tank.restoreState(memento);
              }
          }
      }

8. 状态模式(State)

  • 场景:坦克行为状态切换。
  • 应用
    • 状态类:待机、移动、战斗中。
    • 上下文类:坦克根据状态执行不同行为(如战斗中禁止移动指令)。
    • 代码示例

      interface TankState {
          void handleMove(Tank tank);
          void handleFire(Tank tank);
      }
      class IdleState implements TankState {
          public void handleMove(Tank tank) { tank.setState(new MovingState()); }
          public void handleFire(Tank tank) { /* 待机时无法开火 */ }
      }
      class MovingState implements TankState {
          public void handleMove(Tank tank) { /* 移动中调整路径 */ }
          public void handleFire(Tank tank) { /* 移动中开火精度下降 */ }
      }
      class Tank {
          private TankState state;
          public void setState(TankState state) { this.state = state; }
          public void move() { state.handleMove(this); }
          public void fire() { state.handleFire(this); }
      }

9. 访问者模式(Visitor)

  • 场景:坦克属性统计(如攻击力、防御力)。
  • 应用
    • 访问者:统计模块访问坦克及其部件。
    • 元素:坦克、炮塔、装甲等接受访问。
    • 代码示例
       

      interface TankElement {
          void accept(TankVisitor visitor);
      }
      interface TankVisitor {
          void visitTank(Tank tank);
          void visitTurret(Turret turret);
          void visitArmor(Armor armor);
      }
      class AttributeCalculator implements TankVisitor {
          private int totalAttack = 0;
          private int totalDefense = 0;
          public void visitTank(Tank tank) { /* 汇总部件属性 */ }
          public void visitTurret(Turret turret) { totalAttack += turret.getAttack(); }
          public void visitArmor(Armor armor) { totalDefense += armor.getDefense(); }
          public int getTotalAttack() { return totalAttack; }
          public int getTotalDefense() { return totalDefense; }
      }

10. 中介者模式(Mediator)

  • 场景:坦克编队协同作战。
  • 应用
    • 中介者:编队控制中心协调多辆坦克。
    • 同事类:坦克通过中介者通信(如请求火力支援)。
    • 代码示例
       

      class TankTeamMediator {
          private List<Tank> tanks = new ArrayList<>();
          public void addTank(Tank tank) { tanks.add(tank); }
          public void requestSupport(Tank requester, Coordinates target) {
              for (Tank tank : tanks) {
                  if (tank != requester && tank.canSupport(target)) {
                      tank.moveTo(target);
                      tank.fireAt(target);
                  }
              }
          }
      }
      class Tank {
          private TankTeamMediator mediator;
          public void setMediator(TankTeamMediator mediator) { this.mediator = mediator; }
          public void requestFireSupport(Coordinates target) {
              mediator.requestSupport(this, target);
          }
      }

11. 解释器模式(Interpreter)

  • 场景:坦克指令解析(如玩家输入的文本命令)。
  • 应用
    • 文法规则:定义指令格式(如“move x y”表示移动到坐标(x,y))。
    • 解释器:解析指令并生成可执行命令。
    • 代码示例

      interface CommandExpression {
          Command interpret();
      }
      class MoveCommandExpression implements CommandExpression {
          private int x, y;
          public MoveCommandExpression(int x, int y) { this.x = x; this.y = y; }
          public Command interpret() {
              return new MoveCommand(x, y);
          }
      }
      class CommandParser {
          public Command parse(String input) {
              // 解析输入字符串,生成CommandExpression
              return expression.interpret();
          }
      }

总结

行为模式通过封装变化、解耦对象、定义协作规则,使坦克系统具备高扩展性和灵活性。例如:

  • 策略模式允许坦克动态切换移动算法,适应不同地形。
  • 观察者模式实现状态实时监控,便于战场决策。
  • 责任链模式确保指令按顺序处理,避免冲突。
  • 状态模式使坦克行为随战场态势自动调整。

3.关联链接

4.关联知识 

1.中介者模式、外观模式、代理模式的共性和个性

中介者模式、外观模式和代理模式的共性与区别

一、共性分析
  1. 结构型模式:三者均属于结构型设计模式,核心目标是优化对象间的交互关系,降低系统耦合度。
  2. 间接访问:通过引入中间层(中介者、外观、代理)隔离客户端与后端组件,避免直接依赖。
  3. 简化复杂性:均用于简化系统交互逻辑,提升代码可维护性和扩展性。
二、核心区别

维度中介者模式外观模式代理模式
核心目标管理多对象间的动态交互为复杂子系统提供统一入口控制对目标对象的访问
通信方向双向(对象间可通过中介互访)单向(客户端→子系统)单向(客户端→代理→目标)
职责分布中介者协调交互逻辑外观仅委托请求,不处理业务代理可附加额外功能(如缓存)
典型场景GUI组件通信、智能家居中枢游戏引擎、支付系统集成懒加载、权限控制、远程代理
结构角色中介者、同事类外观类、子系统类代理类、真实主题类
三、深度对比与类比
  1. 中介者模式
    • 类比:智能家居中枢。所有设备(如灯光、空调)通过中枢通信,避免直接依赖。
    • 特点
      • 对象间解耦,交互由中介者协调。
      • 支持多对多关系,但中介者可能成为性能瓶颈。
    • 场景:聊天室消息转发、机场航班调度系统。
  2. 外观模式
    • 类比:酒店前台。客户通过前台统一请求服务(如订房、餐饮),无需了解后台部门协作。
    • 特点
      • 隐藏子系统细节,提供高层接口。
      • 不处理业务逻辑,仅委托请求。
    • 场景:第三方支付集成、微服务网关。
  3. 代理模式
    • 类比:房产中介。代理控制房东与租客的沟通,可附加合同审核等步骤。
    • 特点
      • 控制访问权限或时机(如懒加载)。
      • 代理与真实对象接口一致。
    • 场景:图片懒加载、远程方法调用(RPC)。
四、优缺点总结

模式优点缺点
中介者模式解耦对象、集中管理交互中介者可能过度复杂
外观模式简化接口、降低耦合可能引入额外层次
代理模式增强控制、延迟加载代理层增加调用开销
五、总结
  • 共性:三者均通过中间层优化交互,但职责不同。
  • 区别
    • 中介者:协调多对象交互,适合复杂网状关系。
    • 外观:统一子系统接口,适合简化复杂系统。
    • 代理:控制访问,适合增强功能或延迟加载。

通过合理选择模式,可显著提升系统灵活性和可维护性。

2.策略模式、职责链模式、状态模式有什么共性和个性 

策略模式、职责链模式、状态模式的共性与个性

一、共性分析
  1. 行为型模式:三者均属于行为型设计模式,核心目标是优化对象间的行为协作,提升系统灵活性。
  2. 职责分离:通过抽象和封装,将不同职责或行为分配到独立单元中,避免单一类职责过重。
  3. 扩展性提升:支持通过新增策略、处理者或状态类来扩展系统功能,符合开闭原则。
二、核心区别

维度策略模式职责链模式状态模式
核心目标算法可替换性:客户端动态选择算法。请求处理解耦:请求沿链自动传递。状态驱动行为:行为随状态变化。
交互机制客户端主动选择策略。请求依次传递,处理者决定是否处理。状态自动切换,触发行为变化。
职责分布算法独立,客户端决策。处理者依次尝试处理请求。状态类封装行为,上下文切换状态。
典型场景支付计算、排序算法选择。审批流程、事件处理。订单状态管理、游戏角色状态。
结构角色抽象策略、具体策略、上下文。抽象处理者、具体处理者、客户端。抽象状态、具体状态、上下文。
三、深度对比与类比
  1. 策略模式
    • 类比:电商平台支付方式(支付宝、微信支付)。用户根据需求选择不同支付策略。
    • 特点
      • 算法独立于客户端,支持运行时替换。
      • 客户端需了解所有策略,并主动选择。
    • 场景:游戏角色移动算法(步行、奔跑)、排序算法选择。
  2. 职责链模式
    • 类比:请假审批流程。申请单依次经过组长→经理→HR审批。
    • 特点
      • 请求沿链自动传递,处理者决定是否处理。
      • 解耦请求发送者与接收者,动态扩展处理链。
    • 场景:日志处理(过滤敏感信息→存储数据库)、事件冒泡机制。
  3. 状态模式
    • 类比:交通信号灯。不同状态(红、黄、绿)对应不同行为(停、减速、行)。
    • 特点
      • 行为随状态变化,状态封装为独立类。
      • 状态自动切换,上下文控制状态流转。
    • 场景:订单状态管理(未付款→已发货)、游戏角色状态切换。
四、优缺点总结

模式优点缺点
策略模式算法灵活替换、扩展性强客户端需了解所有策略
职责链模式解耦请求与处理、动态扩展链过长可能导致性能问题
状态模式状态转换清晰、符合开闭原则状态类增多可能增加系统复杂度
五、总结
  • 共性:三者均通过行为抽象和职责分离提升系统灵活性。
  • 个性
    • 策略模式:强调算法可替换性,适用于需要动态选择算法的场景。
    • 职责链模式:强调请求处理解耦,适用于多对象协作处理请求的场景。
    • 状态模式:强调状态驱动行为,适用于对象行为随状态变化的场景。

通过合理选择模式,可以显著提升系统的可扩展性和可维护性。

3.职责链和状态模式接口流转对比 

概述:职责链模式和状态模式都会发生一个接口的调用,在不同的对象流转,而又有不同,职责链的流转是线性的,而状态的模式对相同接口调用形成的调用关系视乎比职责链更复杂 

职责链模式与状态模式接口调用流转的深入分析

一、核心机制对比

维度职责链模式状态模式
流转结构线性链式:请求依次传递,处理者决定传递或终止。状态驱动:流转由状态切换触发,可能形成复杂调用网络。
控制主体客户端动态组装链,运行时调整顺序。状态类自行定义下一状态,编译时确定逻辑。
职责分布处理者兼具处理请求传递请求双重职责。状态类仅负责当前状态的行为,流转由上下文控制。
扩展性通过新增处理者或调整链顺序扩展。通过新增状态类或修改状态转换逻辑扩展。
二、流转过程图解
  1. 职责链模式
    • 线性传递:请求从链头开始,依次经过每个处理者,直到被处理或到达链尾。
    • 示例:请假审批流程(组长→经理→HR)。
       

      graph TD
      A[客户端] --> B[处理者1:组长]
      B --> C[处理者2:经理]
      C --> D[处理者3:HR]
      D --> E[请求终止]
  2. 状态模式
    • 状态驱动:对象状态变化触发行为切换,可能形成循环或分支调用。
    • 示例:订单状态流转(未付款→已发货→已签收)。

      stateDiagram
      [*] --> 未付款
      未付款 --> 已付款: 支付成功
      已付款 --> 已发货: 仓库处理
      已发货 --> 已签收: 用户确认
      已签收 --> [*]

三、关键差异分析
  1. 流转确定性
    • 职责链:流转路径由客户端显式定义(如 h1.setSuccessor(h2)),路径固定但可动态调整。
    • 状态模式:流转由状态类隐式定义(如 context.TransitionTo(newState)),路径依赖状态转换逻辑。
  2. 调用复杂度
    • 职责链:接口调用呈线性增长(O(n)),链越长性能影响越显著。
    • 状态模式:接口调用可能因状态循环或分支呈非线性增长(如 O(2^n)),需谨慎设计状态转换。
  3. 调试难度
    • 职责链:可通过日志或断点追踪链式调用,但长链易导致调试困难。
    • 状态模式:状态转换逻辑分散在多个状态类中,需结合上下文和状态图分析。
四、场景适配性

模式适用场景不适用场景
职责链模式多级审批、事件处理管道状态依赖行为(如订单状态)
状态模式对象行为随状态变化的场景简单线性处理流程
五、设计建议
  1. 职责链模式
    • 控制链长度:避免超长链导致性能问题。
    • 提供默认处理:为未处理请求定义兜底逻辑。
  2. 状态模式
    • 明确状态边界:避免状态类职责重叠。
    • 简化转换逻辑:使用状态表或工具类管理复杂转换。
六、总结
  • 线性性 vs 动态性:职责链的线性流转适合明确处理顺序的场景,状态模式的动态流转适合行为依赖状态的场景。
  • 控制反转:职责链将控制交给客户端,状态模式将控制分散到状态类中。
  • 选择依据:优先用职责链处理流程性任务,用状态模式处理状态驱动型任务

4.行为模式的对比 

概述:对行为型模式,感觉策略是基础,其他的模式都是在这个基础上的展开,尤其是职责链和状态感觉就是对策略的加强,并且这三种模式的本质就是对多态的运用。而模版模式和他们三个相比是多接口的多态。观察和与其相比是双向多态,即观察车本身因为本观察者的不同有一层多态,而被观察者因观察的对象不同又有不同的变化,我把这个叫做双向的多态;而其他的模式,观察者模式,迭代器模式,命令模式,备忘录模式,中介者模式,解释器模式 更像是独具特点的一些模式,甚至有点像一种更具体的通用需求。 

对行为型模式的深度解析:策略模式的基础性与多态的多元运用

一、策略模式的核心地位

策略模式(Strategy Pattern)在行为型模式中具有基础性作用,其核心理念在于算法封装与动态替换。它通过定义一系列可互换的算法族,将行为抽象为独立对象,使得客户端能够在运行时灵活选择或切换算法。这种设计遵循开闭原则,新增算法时无需修改现有代码,只需扩展新的策略类。

关键特性

  • 算法封装:每个策略类封装一个具体算法,独立于客户端。
  • 动态替换:客户端通过组合或聚合关联策略对象,实现行为切换。
  • 开闭原则:新增策略类不影响现有代码,系统扩展性强。
二、职责链模式与状态模式:策略模式的扩展
  1. 职责链模式(Chain of Responsibility)
    • 核心思想:将请求沿处理链传递,直到被处理。每个处理者(Handler)决定是否处理请求或传递给下一个节点。
    • 对策略模式的扩展
      • 线性协作:多个策略类通过链式协作完成复杂任务,客户端无需关心具体处理者。
      • 动态解耦:请求发送者与接收者解耦,链结构可动态调整。
    • 典型场景:多级审批流程、事件处理管道。
  2. 状态模式(State Pattern)
    • 核心思想:对象行为随内部状态变化而变化,状态封装为独立类。
    • 对策略模式的扩展
      • 状态驱动:行为切换由状态转换触发,而非客户端主动选择。
      • 行为局部化:每个状态类封装特定行为,符合单一职责原则。
    • 典型场景:订单状态流转、游戏角色状态切换。
三、多态的多元运用
  1. 策略模式的多态
    • 对象间行为分配:通过组合或聚合关联策略对象,实现算法的动态替换。
    • 示例:支付计算中,客户端根据需求选择支付宝或微信支付策略。
  2. 职责链模式的多态
    • 链式协作多态:请求沿链传递,每个处理者根据类型决定行为。
    • 示例:日志处理中,请求依次经过敏感信息过滤、存储等处理者。
  3. 状态模式的多态
    • 状态驱动多态:对象行为由当前状态决定,状态转换触发行为切换。
    • 示例:交通信号灯状态切换(红→绿→黄)对应不同行为。
  4. 模板方法模式的多接口多态
    • 算法框架定义:父类定义算法框架,子类实现具体步骤。
    • 示例:报表生成中,父类定义生成流程,子类实现数据获取和格式化。
  5. 观察者模式的双向多态
    • 观察者与被观察者的双向依赖
      • 观察者多态:不同观察者响应同一事件的方式不同。
      • 被观察者多态:被观察者状态变化触发不同观察者的更新。
    • 示例:股票价格变动时,不同投资者(观察者)执行不同操作。
四、其他行为型模式的特点与分类

模式核心思想特点典型场景
迭代器模式遍历集合不暴露底层结构提供统一遍历接口,简化集合访问遍历数组、列表、树等集合
命令模式将请求封装为对象支持撤销/重做,解耦请求与接收者撤销操作、宏命令
备忘录模式捕获和恢复对象内部状态实现撤销/重做,保护对象封装性文本编辑器撤销操作
中介者模式封装对象间交互解耦多对象交互,集中控制通信聊天室消息转发
解释器模式定义语言文法并建立解释器支持语法扩展,简化复杂规则实现编译器、规则引擎
五、总结:行为型模式的共性与个性
  • 共性
    • 行为抽象:均关注对象间的行为协作。
    • 多态运用:通过继承、组合或接口实现行为分配。
    • 扩展性:支持系统灵活扩展,符合开闭原则。
  • 个性
    • 策略模式:算法封装与动态替换。
    • 职责链模式:请求链式传递与动态解耦。
    • 状态模式:状态驱动的行为切换。
    • 观察者模式:双向依赖与事件通知。
    • 其他模式:针对特定场景(如遍历、撤销、通信)提供解决方案。

通过理解这些模式的共性与个性,可以更精准地选择合适的设计模式,构建灵活、可维护的系统架构。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值