策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注对象创建,而策略模式关注算法多样性 。
本文目录导读:
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它的客户端。
我们将详细介绍策略模式的概念、特点、应用场景以及实现方法,我们还将通过一个实际的案例来演示如何使用策略模式进行编程。
策略模式概念
策略模式是一种行为型设计模式,它的主要目的是将一组行为封装到一系列可互换的对象中,从而使这些行为可以在运行时根据需要选择和更换,策略模式涉及到三个角色:抽象策略(Strategy)、具体策略(ConcreteStrategy)和上下文(Context)。
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略中的操作,即具体的算法实现。
3、上下文(Context):持有一个策略对象的引用,提供一个方法来设置策略对象。
策略模式特点
1、解耦:策略模式将算法的实现与使用它们的客户端分离,使得客户端不需要关心具体的算法实现,只需要关注于调用相应的方法即可。
2、可扩展:当需要添加新的算法时,只需增加一个新的具体策略类,而无需修改原有的代码。
3、易于维护:由于策略模式将算法的实现与使用它们的客户端分离,因此在修改算法实现时,不会影响到使用该算法的客户端。
策略模式应用场景
1、需要在运行时动态选择算法的情况,排序算法、搜索算法等。
2、当多个子系统具有相同的行为时,可以使用策略模式将这些行为统一起来。
3、当需要避免使用多重条件判断语句时,可以使用策略模式将条件判断逻辑封装起来。
策略模式实现方法
1、定义抽象策略:首先需要定义一个抽象策略类,该类包含一个公共接口,用于定义所有支持的算法。
public interface Strategy { void execute(); }
2、实现具体策略:接下来需要为每个具体算法实现一个具体的策略类,该类实现了抽象策略中的接口。
public class ConcreteStrategyA implements Strategy { @Override public void execute() { System.out.println("执行策略A"); } } public class ConcreteStrategyB implements Strategy { @Override public void execute() { System.out.println("执行策略B"); } }
3、定义上下文:上下文类负责管理策略对象,提供一个方法来设置策略对象。
public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void executeStrategy() { strategy.execute(); } }
4、客户端使用:客户端只需要创建一个上下文对象,并设置相应的策略对象,然后调用上下文对象的方法来执行策略即可。
public class Client { public static void main(String[] args) { Strategy strategyA = new ConcreteStrategyA(); Strategy strategyB = new ConcreteStrategyB(); Context context = new Context(strategyA); // 或者 context = new Context(strategyB); context.executeStrategy(); // 或者 context.setStrategy(strategyB); 然后重新执行 context.executeStrategy(); } }