策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法独立于使用它的客户端。
策略模式的主要目的是在运行时根据不同情况选择不同的算法或策略,这种模式通常用于需要在运行时动态选择行为的场景,例如排序、搜索和计算等。
策略模式的核心组件包括:
1.上下文(Context) :上下文是策略模式的运行环境,它负责维护一个策略对象的引用,策略对象是实现具体策略的类,它们实现了相同的接口。
2.策略(Strategy) :策略是具体的算法或策略实现,它们实现了相同的接口,策略对象可以在运行时被上下文切换。
下面我们通过一个简单的例子来说明策略模式的使用:
假设我们需要对一组数字进行排序,我们可以使用冒泡排序、插入排序和选择排序等不同的排序算法,如果我们需要在运行时根据不同的条件选择不同的排序算法呢?这时,我们可以使用策略模式来解决这个问题。
我们定义一个排序接口SortInterface
,它包含一个sort()
方法:
public interface SortInterface { void sort(int[] arr); }
我们实现三种不同的排序算法,并将它们封装在具有共同接口的类中:
public class BubbleSort implements SortInterface { @Override public void sort(int[] arr) { // 实现冒泡排序算法 } } public class InsertionSort implements SortInterface { @Override public void sort(int[] arr) { // 实现插入排序算法 } } public class SelectionSort implements SortInterface { @Override public void sort(int[] arr) { // 实现选择排序算法 } }
我们创建一个上下文类SortContext
,它维护一个策略对象的引用,并提供一个方法来设置新的策略:
public class SortContext { private SortInterface strategy; public void setStrategy(SortInterface strategy) { this.strategy = strategy; } public void sort(int[] arr) { strategy.sort(arr); } }
我们在客户端代码中使用上下文类来选择合适的排序算法:
public class StrategyPatternDemo { public static void main(String[] args) { int[] arr = new int[]{5, 3, 8, 4, 2}; // 需要排序的数组 SortContext context = new SortContext(); // 创建上下文对象并初始化为默认策略(空实现) ; // 这里可以设置为其他已实现的策略对象,如BubbleSort、InsertionSort等,在本例中,我们暂时将其保持为空实现,context.setStrategy(new BubbleSort()); // 根据条件设置合适的排序策略 context.sort(arr); // 对数组进行排序