策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时根据对象的行为或其算法进行选择,这种模式定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换,策略模式让算法独立于使用它的客户而变化,即算法可以在不影响客户端的情况下改变。
在Java中应用策略模式主要涉及以下几个关键部分:
1、策略接口(Strategy Interface):定义所有支持的算法的公共接口,环境角色使用这个接口来调用具体策略定义的算法。
2、具体策略(Concrete Strategies):实现策略接口的具体类,提供具体的算法实现。
3、上下文(Context):用来维护对策略对象的引用,可定义一个接口来让策略对象访问其数据。
下面通过一个示例来演示如何在Java中实现策略模式:
// 策略接口 public interface Strategy { void execute(); } // 具体策略A public class ConcreteStrategyA implements Strategy { @Override public void execute() { System.out.println("执行策略A"); } } // 具体策略B public class ConcreteStrategyB implements Strategy { @Override public void execute() { System.out.println("执行策略B"); } } // 上下文 public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void contextInterface() { strategy.execute(); } } // 客户端代码 public class Client { public static void main(String[] args) { // 创建具体策略对象 Strategy strategyA = new ConcreteStrategyA(); Strategy strategyB = new ConcreteStrategyB(); // 创建上下文并设置具体策略 Context context = new Context(strategyA); context.contextInterface(); // 输出 "执行策略A" // 切换策略 context.setStrategy(strategyB); context.contextInterface(); // 输出 "执行策略B" } }
在上面的例子中,Strategy
是一个接口,定义了 execute
方法;ConcreteStrategyA
和 ConcreteStrategyB
是实现了 Strategy
接口的具体策略类;Context
是一个上下文类,负责维护对策略对象的引用,并通过 contextInterface
方法来使用策略,客户端代码可以根据需要动态地更改上下文中的策略。
相关问题与解答
问题1: 策略模式适用于什么场景?
答案: 策略模式适用于那些需要动态更换算法的场景,或者当你想避免使用多重条件转移语句时,不同类型的排序算法、支付方式的选择、不同国家的货币格式化等。
问题2: 策略模式与工厂模式有什么区别?
答案: 策略模式关注的是算法的替换和选择,它定义了一系列可互换的算法,并在运行时决定使用哪一个算法,而工厂模式关注的是对象的创建过程,它提供一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂模式将对象的创建推迟到子类,两者的共同点是都提供了一种避免将具体类硬编码到客户端的方式,但关注点不同。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/292919.html