策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。工厂模式则是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的方式。两者的主要区别在于,策略模式关注的是对象的行为变化,而工厂模式关注的是对象的创建过程。
策略模式(Strategy Pattern)是面向对象编程中的一种设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,这种模式让算法独立于使用它的客户端,从而可以在运行时改变算法,策略模式主要解决的是当客户端的行为依赖于一些不可预测的条件时,如何将这些行为与条件解耦的问题。
策略模式的主要角色有三个:
1、上下文(Context):持有一个Strategy的引用,负责调用Strategy的算法。
2、策略(Strategy):定义了一组算法,可以被客户端调用。
3、具体策略(ConcreteStrategy):实现了Strategy接口的具体算法。
策略模式的优点:
1、提供了管理相关的算法族的办法,策略类的等级结构定义了一个算法或行为族,恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
2、提供了可以互换算法或策略的方法,策略类的等级结构使得我们可以构造一个算法族,根据输入数据参数的不同选择不同的算法或策略。
3、保证了算法或策略的平等性,策略模式支持开闭原则,用户可以在不修改原有代码的情况下更换算法或策略。
策略模式的缺点:
1、客户端必须知道所有的策略,并自行决定使用哪一个策略,这就意味着客户端必须理解每一个策略是如何实现的。
2、会产生很多的策略类,增加系统的复杂度。
策略模式的使用场景:
1、如果在一个系统里面有许多类都依赖于一些算法,那么可以使用策略模式将这些依赖抽象化。
2、如果一个类的行为或其算法需要在运行时根据环境或用户输入等因素改变,那么可以使用策略模式来实现。
策略模式的实例:
假设我们有一个游戏,游戏中有不同的角色,每个角色都有攻击和防御两种行为,但是每个角色的攻击和防御方式都不同,我们可以使用策略模式来实现这个需求。
我们定义一个策略接口,包含攻击和防御两个方法:
public interface Strategy { void attack(); void defense(); }
我们为每个角色定义一个具体的策略类:
public class WarriorStrategy implements Strategy { @Override public void attack() { System.out.println("Warrior attacks with a sword."); } @Override public void defense() { System.out.println("Warrior defends with a shield."); } } public class MageStrategy implements Strategy { @Override public void attack() { System.out.println("Mage attacks with magic."); } @Override public void defense() { System.out.println("Mage defends with spells."); } }
我们定义一个角色类,该类持有一个策略对象的引用,并提供攻击和防御的方法:
public class Role { private Strategy strategy; public Role(Strategy strategy) { this.strategy = strategy; } public void attack() { strategy.attack(); } public void defense() { strategy.defense(); } }
我们可以在客户端代码中使用这些类:
public class Main { public static void main(String[] args) { Role warrior = new Role(new WarriorStrategy()); Role mage = new Role(new MageStrategy()); warrior.attack(); warrior.defense(); mage.attack(); mage.defense(); } }
就是策略模式的解析和实践应用,策略模式是一种非常实用的设计模式,它可以帮助我们更好地管理和维护复杂的算法和策略,提高代码的可读性和可维护性。