主页 > 人物

策略模式的意图、动机和结构

时间:2019-10-14 来源:llw说笑
策略模式的意图、动机和结构

意图

为一系列算法定义共通的接口,使它们可以相互替换。

动机

假设我们有个数据处理软件,当它取得数据之后需要进行某些处理。这些处理可以简单,例如限幅,求绝对值等,也可能比较复杂,如移动平均,计算差分等。一般来讲,如果将这些处理单独考虑的时候难度不会太大。但是有一点比较麻烦的是,根据数据和需求的不同,可能需要不同形式的处理。更加麻烦的是,具体的输入数据的类型,需求需要等到软件执行时才可以确定,也就是说需要动态替换这些处理。

为了解决这个问题我们可以定义共通的接口来抽象这些处理。对于上面的例子来说,定义一个y=f(x)应该就可以满足要求。对于任意一个输出,只要产生适当的输出即可。对于移动平均等处理来说,可能会稍微麻烦一些,但也无非就是内部再准备一个缓冲区以管理过去一段时间的数据就可以解决问题。

策略模式的意图、动机和结构


结构

当某些处理可以抽象出相同的接口,只是内部具体的行为有所不同时,可以使用策略模式从而实现动态变更处理内容的目的。


策略模式的意图、动机和结构

本图引用自《设计模式》一书

策略类Strategy定义用于共通的处理接口。Context使用这个接口来调用相应的处理。这里的处理可以是对数据的加工,也可以只是执行某个动作。

具象策略类ConcreteStrategy负责具体实现策略类定义的接口。只要保证接口的一致性,具象策略类可以自由地扩展新功能。为了达成目的,具象策略类经常需要保持某些必要的信息。这一点也是将策略封装成类之后一个便利之处。

策略模式的意图、动机和结构

上下文类Context类首先需要管理一个策略类对象的参照。根据用户的指定或者其他方式,这个参照可指向任意一个具体具象策略类ConcreteStrategy。但数据处理流程执行时,上下文类还负责为策略对象提供输入数据和取出输出数据。决定策略的上下文,管理和使用策略的上下文不一定是同一个对象。


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

有任何疑问,欢迎留言提问或讨论。

面向对象设计,面向对象编程,面向对象思考