概述
当要从同一需求的不同策略实现中选一个策略来执行时,往往需要多重选择。
策略模式将算法的责任和算法的解耦,通过把策略实现封装在策略接口的不同实现类中,在需要某种策略时传入具体的策略实现,避免了多重选择。
在需要新的策略时传入策略对象,而不是在一大段代码中做多重选择。
结构
抽象策略类: 通常由接口或抽象类实现,给出所有具体策略类所需方法。(定义策略职责)
具体策略类: 根据不同策略给出不同的抽象策略类实现方案。(实现不同策略)
策略引用类: 根据持有的不同策略对象对外提供不同的策略实现方案。(使用策略)
实现
让具体策略类实现抽象策略类,给策略引用类传入不同的具体策略类,使用不同测策略。
优缺点
优点:
避免使用多重条件选择语句(if else),充分体现面向对象设计思想。
策略类之间可以自由切换。
易于扩展。
缺点:
客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
适用场景
一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中。
一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。
系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。
多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。
策略模式举例
Comparator
中的策略模式。