this关键字在策略模式中不用于动态指派上下文环境,其真实作用是:在context中调用自身方法、将当前实例传给strategy以支持回调,而动态切换策略依赖context对strategy字段的运行时赋值。

this 关键字在策略模式中不用于“动态指派上下文环境”——这是对 this 和策略模式的常见误解。策略模式的核心是**解耦算法与使用算法的上下文(Context)**,而 this 本身只是 Java/C# 等语言中指向当前对象实例的引用,它不具备“动态指派”或“切换上下文环境”的能力。
策略模式中 this 的真实作用
在标准策略模式实现中,this 通常出现在 Context 类内部,用于:
- 调用当前 Context 实例的方法(如获取输入数据、触发回调、记录日志等)
- 将 Context 自身作为参数传给 Strategy(例如:strategy.execute(this)),让策略能回调上下文的能力
- 在 Strategy 实现类中访问其所属对象的状态(但注意:策略本身不应持有上下文状态,否则违反策略的可替换性)
真正实现“动态绑定算法”的方式
动态选择策略靠的是 Context 对 strategy 字段的运行时赋值,而非 this。典型做法是:
- Context 持有一个 Strategy 接口类型的成员变量(如 private Strategy strategy;)
- 提供 setter 方法(setStrategy(Strategy s))或构造时注入
- 在业务逻辑中根据条件切换策略:context.setStrategy(new DiscountStrategyV2());
- 执行时统一调用:context.execute(); → 内部委托给当前 strategy
何时需要把 this 传给策略?
仅当策略需反向访问 Context 的某些能力(且这些能力不适合通过参数传入)时才考虑。例如:
- 策略需要读取 Context 中的配置项(this.getConfig().getTimeout())
- 策略执行后需通知 Context 更新状态(this.notifyCompletion())
- 策略需调用 Context 的模板方法(如日志、事务、重试封装)
此时应在 execute 方法签名中显式接收 Context 或其接口:execute(Context context),并在 Context 中调用 strategy.execute(this) —— 这里的 this 是明确传递当前上下文实例,不是“动态指派”,而是常规的对象引用传递。
避免的误区
- 不要在 Strategy 子类中直接依赖具体 Context 类型(破坏解耦),应定义 Context 的最小接口供策略使用
- 不要试图用 this 改变策略的归属对象(策略实例本身无“所属”概念,它只是被 Context 持有和调用)
- 不要在策略内部修改 Context 的 strategy 字段(策略只负责算法,不负责调度)











