策略模式和工厂模式都是设计模式,但是它们的目的和实现方式不同。工厂模式是一种创建型模式,它关注对象的创建,而策略模式是一种行为型模式,它关注行为的封装 。,,工厂模式是通过一个工厂类来创建对象,而策略模式则是通过定义一系列算法或策略来实现不同的行为。在运行时,可以根据需要选择使用哪个算法或策略 。
在面向对象编程中,设计模式是一种被广泛接受并用于解决特定问题的经验丰富的解决方案,它们为软件开发人员提供了一种可重用的、经过验证的方法来解决常见的软件设计问题,本文将重点讨论策略模式,这是一种在运行时改变对象行为的优秀设计模式。
策略模式定义了一个算法族,其中封装了一组可互换的算法,并使它们可以相互替换,策略模式使算法的变化独立于使用它的客户端,这使得算法可以在不影响客户端的情况下进行更改。
策略模式的主要优点如下:
1、提高了代码的可扩展性:通过使用策略模式,我们可以在不修改现有代码的情况下添加新的算法,这使得我们的代码更加灵活,更容易适应需求的变化。
2、降低了耦合度:策略模式将算法的实现与使用它们的客户端分离,从而降低了它们之间的耦合度,这使得我们可以在不影响其他部分的情况下对算法进行修改或优化。
3、提高了代码的可读性和可维护性:策略模式通过将算法的实现封装在独立的类中,使得这些类更加清晰和易于理解,由于策略模式允许我们在运行时动态地选择和切换算法,因此我们可以在不修改客户端代码的情况下对算法进行调试和测试。
4、提高了代码的复用性:策略模式允许我们将不同的算法封装在独立的类中,从而使得这些类可以在不同的上下文中重复使用,这有助于减少代码的冗余,并提高代码的复用性。
下面我们来看一个简单的策略模式的例子:
假设我们正在开发一个游戏,游戏中的角色可以使用不同的移动策略,角色可以选择“跑步”、“跳跃”或“游泳”作为其移动策略,我们可以使用策略模式来实现这个功能:
我们需要定义一个表示移动策略的接口:
public interface MoveStrategy { void move(); }
我们可以为每种移动策略实现这个接口:
public class RunMoveStrategy implements MoveStrategy { @Override public void move() { System.out.println("Running"); } } public class JumpMoveStrategy implements MoveStrategy { @Override public void move() { System.out.println("Jumping"); } } public class SwimMoveStrategy implements MoveStrategy { @Override public void move() { System.out.println("Swimming"); } }
我们需要创建一个表示角色的类,该类可以使用不同的移动策略:
public class Character { private MoveStrategy moveStrategy; public Character(MoveStrategy moveStrategy) { this.moveStrategy = moveStrategy; } public void setMoveStrategy(MoveStrategy moveStrategy) { this.moveStrategy = moveStrategy; } public void performMove() { moveStrategy.move(); } }
我们可以在运行时为角色设置不同的移动策略:
public class Main { public static void main(String[] args) { Character character = new Character(new RunMoveStrategy()); // Set the initial move strategy as running character.performMove(); // Output: Running character.setMoveStrategy(new JumpMoveStrategy()); // Change the move strategy to jumping and perform the move again character.performMove(); // Output: Jumping } }