作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。
一、什么是策略模式
策略模式是一种软件设计模式,它定义了一系列算法,将每个算法都封装起来,并且使它们可以互相替换。策略模式可以使算法的变化独立于使用它的客户端。
在策略式中,通常会有一个抽象策略接口,它定义了一个公共的方法或操作,具体的策略类实现了该接口,并提供不同的算法实现。客户端类(Context)持有一个策略对象,并根据需要调用策对象的方法来执行具体的算法。
使用策略模式的好处是可以在不修改客户端的情况下,动态地改变算法的实现,提高了代码的灵活性和可扩展性。同时,策略模式也符合单一职责原则,每个体策略类只负责一个算法的实现,使代码更加清晰易懂。
在 Java 语言中,策略模式可以通过接口和实现类的方式来实现,也可以通过函数式接口和 Lambda
表达式的方式来实现。无论采用哪种方式,策略式都可以帮助我们实现算法的动态切换和灵活性设计。
二、策略模式实例
下面是一个使用策略模式的 Java 示例代码,请同学们认真学习。
首先,我们定义一个策略接口 PaymentStrategy
,它包含一个 pay
方法用于支付操作:
public interface PaymentStrategy {
void pay(double amount);
}
然后,我们实现两个具体的策略类 CreditCardStrategy
和 PayPalStrategy
,分别实现了 PaymentStrategy
接口:
public class CreditCardStrategy implements PaymentStrategy {
private String cardNumber;
private String cvv;
private String expirationDate;
public CreditCardStrategy(String cardNumber, String cvv, String expirationDate) {
this.cardNumber = cardNumber;
this.cvv = cvv;
this.expirationDate = expirationDate;
}
public void pay(double amount) {
System.out.println("Paid $" amount " using credit card.");
}
}
public class PayPalStrategy implements PaymentStrategy {
private String email;
private String password;
public PayPalStrategy(String email, String password) {
this.email = email;
this.password = password;
}
public void pay(double amount) {
System.out.println("Paid $" amount " using PayPal.");
}
}
接下来,我们创建一个上下文类 PaymentContext
,它持有一个 PaymentStrategy
对象,并提供了一个 pay
方法用于执行支付操作,代码如下。
public class PaymentContext {
private PaymentStrategy paymentStrategy;
public PaymentContext(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void payAmount(double amount) {
paymentStrategy.pay(amount);
}
}
最后,我们使用策略模式来进行支付操作,代码如下。
代码语言:javascript复制public class Main {
public static void main(String[] args) {
// 创建一个上下文对象,指定使用CreditCardStrategy策略
PaymentContext context = new PaymentContext(new CreditCardStrategy("123456789", "123", "12/23"));
context.payAmount(100.0);
// 创建一个上下文对象,指定使用PayPalStrategy策略
context = new PaymentContext(new PayPalStrategy("test@example.com", "password"));
context.payAmount(50.0);
}
}
以上示例代码演示了策略模式在 Java 中的使用,通过定义不同的策略类,并上下文对象中动态切换策略,可以实现不同的支付方式。
这样,我们可以方便地扩展和修改支付策略,而无需修改客户端代码。
三、策略模式的应用场景
策略模式在Java中有许多应用场景,以下是一些常见的例子,请同学们认真学习。
- 算法选择:当需要根据不同的条件或情况选择不同的算法时,策略模式可以提供一种灵活的方式来实现。例如,根据不同的排序要求选择不同的排序算法,或者根据不同的支付方式选择不同的支付策略。
- 表单验证:在表单验证中,可以使用策略模式来实现不同的验证规则。例如,对于不同的字段,可以使用不同的验证策略进行验证,如手机号码验证、邮箱验证、密码强度验证等。
- 缓存策略:在缓存系统中,可以使用策略模式来定义不同的缓存策略。例如,可以根据访问频率、数据有效期等条件选择合适的缓存策略,如
LRU
(最近最少使用)、LFU
(最不经常使用)等。 - 日志输出:在日志输出中,可以使用策略模式来选择不同的日志输出策略。例如,可以根据日志级别选择将日志输出到文件、控制台、数据库等不同的目标。
- 策略游戏:在策略游戏中,可以使用策略模式来实现不同的战略和策略。例如,根据不同的敌人类型选择不同的攻击策略,或者根据不同的地形选择不同的行军策略。
这些是常见的应用场景,策略模式在实际开发中还有许多其他应用。总的来说,策略模式适用于需要在运行时动态切换算法或行为的情况,可以提高代码的灵活性和可扩展性。
四、策略模式面试题
1.什么是策略模式?它的作用是什么?
答:策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装成独立的策略类,使得它们可以互相替换。策略模式的作用是在运行时根据需求动态选择算法,提高代码的灵活性和可维护性。
2.策略模式的组成部分有哪些?
答:策略模式由三个主要组成部分组成,分别是策略接口,具体策略类和上下文类。策略接口定义了策略类需要实现的方法,具体策略类实现了策略接口的方法,上下文类持有一个策略对象,并根据需要调用策略对象的方法。
3.策略模式和工厂模式的区别是什么?
答:策略模式和工厂模式都是常见的设计模式,但它们解决的问题和使用场景有所不同。策略模式解决的问题是动态选择算法,针对不同的情况选择不同的策略。而工厂模式解决的是对象的创建问题,通过工厂类来创建对象,隐藏了具体的实现细节。简单来说,策略模式关注的是算法的选择,而工厂模式关注的是对象的创建。
4.策略模式的优缺点是什么?
答:策略模式的优点包括灵活性高,可扩展性好,算法的变化独立于使用它的客户端。策略模式的缺点是增加了类的数量,每个具体策略类都需要单独实现一个策略接口,增加了代码的复杂度。
5.策略模式和状态模式有什么区别?
答:策略模式和状态模式都是行为型设计模式,它们的区别在于目的和使用场景。策略模式是为了实现不同的算法选择,根据不同的条件选择不同的策略。而状态模式是为了实现对象状态的变化,根据对象的状态选择不同的行为。简单来说,策略模式关注的是算法的切换,而状态模式关注的是对象状态的变化。