策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注对象创建,而策略模式关注算法多样性。 ,,工厂模式是一种创建型模式,它提供了一种创建对象的方法,使得创建对象的过程与使用对象的过程分离。而策略模式则是一种行为型模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换。
在策略模式中,我们可以将不同的算法实现为独立的类,并通过一个上下文对象来调用它们,这样,当我们需要更换算法时,只需要更改上下文对象中的算法实现即可,而不需要修改使用这些算法的客户端代码。
下面是一个简单的策略模式示例:
// 定义一个策略接口 interface Strategy { void execute(); } // 实现不同的算法 class ConcreteStrategyA implements Strategy { @Override public void execute() { System.out.println("执行算法A"); } } class ConcreteStrategyB implements Strategy { @Override public void execute() { System.out.println("执行算法B"); } } // 定义一个上下文类,用于保存当前使用的策略对象 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(); } } public class StrategyPatternDemo { public static void main(String[] args) { // 创建两个不同的策略对象 Strategy strategyA = new ConcreteStrategyA(); Strategy strategyB = new ConcreteStrategyB(); // 创建一个上下文对象,并将策略对象保存在其中 Context context = new Context(strategyA); // 执行当前策略对象的算法 context.executeStrategy(); // 输出:执行算法A // 将策略对象切换为另一个策略对象,并重新执行算法 context.setStrategy(strategyB); context.executeStrategy(); // 输出:执行算法B } }
在这个示例中,我们定义了一个策略接口Strategy
,以及两个实现了该接口的具体策略类ConcreteStrategyA
和ConcreteStrategyB
,我们还定义了一个上下文类Context
,用于保存当前使用的策略对象,并提供一个方法executeStrategy()
来执行当前策略对象的算法。
在main
函数中,我们创建了两个不同的策略对象strategyA
和strategyB
,并将它们保存在一个上下文对象context
中,然后我们调用context.executeStrategy()
来执行当前策略对象的算法,当我们需要更换算法时,只需要调用context.setStrategy()
方法将策略对象切换为另一个策略对象即可。