策略模式和工厂模式都是设计模式中的行为型模式,但是它们的关注点不同。策略模式关注的是算法的多样性,可以将算法封装、分离和替换,实现开闭原则。而工厂模式关注的是对象的创建,使得创建对象的过程与使用对象的过程分离。
策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立的类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
在编程中,我们经常需要根据不同的情况执行不同的操作,我们在处理文件时,可能需要根据文件的大小、类型等不同属性来选择不同的处理方式,这时,我们就可以使用策略模式来实现这一需求。
策略模式的主要角色有以下几个:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略中的每一个方法,提供具体的算法实现。
3、上下文(Context):持有一个策略类的引用,当前环境所需要使用的策略。
4、客户端(Client):使用上下文对象调用具体策略的方法。
下面我们通过一个简单的例子来说明如何使用策略模式,假设我们正在编写一个程序,该程序可以根据用户的输入生成相应的输出,在这个例子中,我们的“用户输入”和“输出”可以被视为两种不同的策略。
我们定义一个抽象策略接口:
public interface OutputStrategy { void printOutput(); }
我们创建两个实现该接口的具体策略类:
public class PrintToConsoleOutputStrategy implements OutputStrategy { @Override public void printOutput() { System.out.println("Output to console"); } } public class PrintToFileOutputStrategy implements OutputStrategy { @Override public void printOutput() { System.out.println("Output to file"); } }
我们定义一个上下文类,用于保存当前使用的策略:
public class OutputContext { private OutputStrategy strategy; public OutputContext(OutputStrategy strategy) { this.strategy = strategy; } public void setStrategy(OutputStrategy strategy) { this.strategy = strategy; } public void executeStrategy() { strategy.printOutput(); } }
我们在客户端代码中使用上下文对象来调用具体策略的方法:
public class Main { public static void main(String[] args) { OutputContext context = new OutputContext(new PrintToConsoleOutputStrategy()); context.executeStrategy(); // Output to console context.setStrategy(new PrintToFileOutputStrategy()); context.executeStrategy(); // Output to file } }
通过这种方式,我们可以在运行时轻松地切换不同的策略,而无需修改客户端代码,这就是策略模式的优点之一。