策略模式是一种设计模式,它定义了一系列算法,并将每个算法封装起来,使他们可以互相替换。工厂模式则是一种创建型模式,它提供了一种在不指定具体类的情况下创建对象的方法。两者之间的区别在于策略模式侧重于定义一系列算法,而工厂模式则侧重于创建对象。
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为,在许多情况下,策略模式可以替代传统的条件语句或多重继承,这种模式将一组算法封装到一个具有共同接口的独立的类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
策略模式的主要组成部分包括:
1、上下文(Context):持有一个Strategy的引用。
2、Strategy:定义了一组算法,每个算法都实现某一特定的行为。
3、具体策略(ConcreteStrategy):实现了Strategy定义的一组算法中的一个。
让我们通过一个简单的例子来理解策略模式,假设我们有一个游戏角色,这个角色可以根据敌人的类型选择不同的战斗策略,在这种情况下,我们可以使用策略模式来实现。
我们定义一个抽象的策略接口,这个接口包含一个用于攻击的方法:
public interface FightStrategy { void fight(); }
我们可以为每种敌人类型定义一个具体的策略:
public class SwordFightingStrategy implements FightStrategy { @Override public void fight() { System.out.println("Sword fighting..."); } } public class MagicFightingStrategy implements FightStrategy { @Override public void fight() { System.out.println("Magic fighting..."); } }
我们定义一个上下文,这个上下文持有一个策略的引用,并决定使用哪种策略:
public class GameCharacter { private FightStrategy strategy; public GameCharacter(FightStrategy strategy) { this.strategy = strategy; } public void setStrategy(FightStrategy strategy) { this.strategy = strategy; } public void fight() { strategy.fight(); } }
我们可以在运行时改变游戏角色的战斗策略:
public class Main { public static void main(String[] args) { GameCharacter character = new GameCharacter(new SwordFightingStrategy()); character.fight(); // Prints: Sword fighting... character.setStrategy(new MagicFightingStrategy()); character.fight(); // Prints: Magic fighting... } }
在这个例子中,策略模式允许我们在运行时改变游戏角色的战斗策略,而不需要修改游戏角色的代码,这使得我们的代码更加灵活和可维护。
策略模式是一种非常强大的设计模式,它可以帮助我们编写更加灵活和可维护的代码,策略模式也有其缺点,如果策略的数量增加,那么策略模式可能会变得复杂和难以管理,在使用策略模式时,我们需要权衡其优点和缺点。