古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
个人CSND主页——Micro麦可乐的博客
《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,将每个算法封装起来,并使它们可以相互替换,以便根据不同的情况选择不同的算法进行执行。
算法的选择性
:当程序需要根据不同的情况选择不同的算法或策略时,策略模式可以很好地应用。它允许在运行时动态地切换算法,使得系统更具灵活性和可扩展性。
多个类似行为的存在
:如果一个类拥有多个类似的行为,但每个行为在实现上有所不同,那么可以使用策略模式来将这些行为封装在独立的策略类中,并使它们可以互相替换。这样可以避免使用大量的条件语句或分支逻辑,使代码更加清晰和可维护。
避免暴露复杂的条件逻辑
:当存在大量复杂的条件逻辑时,使用策略模式可以将这些逻辑封装在具体的策略类中,使得主体逻辑更加简洁,易于理解和维护。
需要在运行时动态地选择算法或策略
:策略模式允许在运行时根据需要动态地选择不同的算法或策略。这对于需要根据用户输入、环境变量或其他动态因素来选择合适的算法或策略的情况非常有用。
希望避免使用继承的情况
:策略模式可以代替继承来实现不同行为的变化。通过使用组合而不是继承,可以更灵活地组织和管理代码。
策略模式在许多领域都有应用,包括软件开发、游戏开发、金融领域、人工智能等。它可以帮助提高代码的可维护性、灵活性和可扩展性,同时降低代码的耦合度。
在生活场景中,我们可以通过以下例子来说明策略模式:
每每到了618、双11,你的女朋友经常会在不同的电商平台上购物。她喜欢寻找最佳的优惠策略来节省花费,因此她会根据不同的购物情况采用不同的优惠策略;
现在她要开始败家了,她上了某宝,某宝活动综合提供了20%的整体折扣优惠,并适用于所有的商品。同时发现护肤专区满减优惠满1000减250,这个时候她的CPU飞速计算:
于是在她一通操作下,将自己想要的加入到了购物车,并毫不犹豫找到你买单结算 ;
上面女朋友购物案例中,我们使用JAVA代码来给大家演示一下
//定义策略接口
public interface DiscountStrategy {
double applyDiscount(double price);
}
创建打折优惠策略
/**
* 打折优惠策略
*/
public class Discount implements DiscountStrategy{
private double discountPercentage;
public Discount(double discountPercentage) {
this.discountPercentage = discountPercentage;
}
@Override
public double applyDiscount(double price) {
return price * (1 - discountPercentage);
}
}
创建满减优惠策略
/**
* 满减优惠策略
*/
public class FullReduction implements DiscountStrategy{
//定义满减临界值
private double threshold;
//定义满减金额
private double reductionAmount;
public FullReduction(double threshold, double reductionAmount) {
this.threshold = threshold;
this.reductionAmount = reductionAmount;
}
@Override
public double applyDiscount(double price) {
if (price >= threshold) {
return price - reductionAmount;
} else {
return price;
}
}
}
定义女友类
/**
* 定义女友 购物策略结算
*/
public class Girlfriend {
private DiscountStrategy discountStrategy;
public void setDiscountStrategy(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double checkout(double totalPrice) {
System.out.println("女友CPU飞速运转");
return discountStrategy.applyDiscount(totalPrice);
}
}
最后测试类
public class StrategyPatternTest {
public static void main(String[] args) {
Girlfriend cart = new Girlfriend();
// 使用打折优惠策略
DiscountStrategy discountStrategy = new Discount(0.2);
cart.setDiscountStrategy(discountStrategy);
double totalPrice = 100.0;
double finalPrice = cart.checkout(totalPrice);
System.out.println("使用打折优惠后的价格:" + finalPrice);
// 使用满减优惠策略
DiscountStrategy fullReductionStrategy = new FullReduction(200.0, 50.0);
cart.setDiscountStrategy(fullReductionStrategy);
totalPrice = 250.0;
finalPrice = cart.checkout(totalPrice);
System.out.println("使用满减优惠后的价格:" + finalPrice);
}
}
最后输出如下:
这个现实生活场景中的购物案例展示了策略模式的应用。通过选择不同的购物策略,你能够根据不同商城的促销优惠来获取最佳的价格。策略模式使得购物策略的变化独立于你的购物行为,为你提供了灵活性和选择性。
在一个电商平台上,用户可以选择不同的支付方式来完成订单支付,比如信用卡支付、支付宝支付、微信支付等。每种支付方式都有自己的特点和实现方式。
在这种情况下,策略模式可以被应用于支付场景中。让我们看看如何使用策略模式来实现支付功能:
首先,我们定义一个支付策略接口,例如 PaymentStrategy
:
public interface PaymentStrategy {
void pay(double amount);
}
然后,我们创建不同的支付策略类来实现具体的支付方式,比如 信用卡支付 CreditCardPaymentStrategy
、支付宝支付 AlipayPaymentStrategy
、微信支付 WeChatPaymentStrategy
等。
//信用卡支付策略
public class CreditCardPaymentStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
// 实现信用卡支付逻辑
System.out.println("使用信用卡支付:" + amount + " 元");
}
}
//支付宝支付策略
public class AlipayPaymentStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
// 实现支付宝支付逻辑
System.out.println("使用支付宝支付:" + amount + " 元");
}
}
//微信支付策略
public class WeChatPaymentStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
// 实现微信支付逻辑
System.out.println("使用微信支付:" + amount + " 元");
}
}
接下来,我们创建一个订单类 Order,它具有支付功能,通过设置不同的支付策略来完成支付。
public class Order {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void processPayment(double amount) {
// 调用支付策略的支付方法
paymentStrategy.pay(amount);
}
}
最后,我们可以在客户端代码中使用策略模式来完成订单支付:
public class PaymentApp {
public static void main(String[] args) {
Order order = new Order();
// 使用信用卡支付
PaymentStrategy creditCardPayment = new CreditCardPaymentStrategy();
order.setPaymentStrategy(creditCardPayment);
order.processPayment(100.0);
// 使用支付宝支付
PaymentStrategy alipayPayment = new AlipayPaymentStrategy();
order.setPaymentStrategy(alipayPayment);
order.processPayment(200.0);
// 使用微信支付
PaymentStrategy weChatPayment = new WeChatPaymentStrategy();
order.setPaymentStrategy(weChatPayment);
order.processPayment(300.0);
}
}
在上述代码中,我们创建了一个订单对象 order
,然后根据用户选择的支付方式设置相应的支付策略,最后调用 processPayment
方法来完成支付。
通过策略模式,用户可以根据自己的需求选择不同的支付方式,而不需要修改订单类的代码。这样可以使系统更加灵活,易于扩展和维护。
这个支付场景的例子展示了策略模式在实际应用中的使用,它将支付方式的选择和具体的支付逻辑解耦,提供了一种灵活的设计方案。
本章主要带大家认识什么是策略模式,策略模式适用场景有哪些,并通过两个现实生活的场景给大家演示策略模式的使用,策略模式也是我们平时开发经常会用的模式之一,希望大家能熟练掌握~ 如果本篇文章对你有用,欢迎关注收藏评论!
样例代码:https://github.com/lhmyy521125/toher-designmode