行为模式9.策略模式------促销活动设计方案

行为型模式

  1. 模板方法模式(Template Method Pattern)
  2. 命令模式(Command Pattern)
  3. 迭代器模式(Iterator Pattern)
  4. 观察者模式(Observer Pattern)
  5. 中介者模式(Mediator Pattern)
  6. 备忘录模式(Memento Pattern)
  7. 解释器模式(Interpreter Pattern)
  8. 状态模式(State Pattern)
  9. 策略模式(Strategy Pattern)
  10. 职责链模式(Chain of Responsibility Pattern)
  11. 访问者模式(Visitor Pattern)

策略模式是一种行为设计模式,它允许在运行时选择算法的行为。这种模式定义了一系列的算法,将每一个算法封装起来,并且使它们可以相互替换。通过这种方式,客户端可以在不改变其代码的情况下改变使用的算法。

在策略模式中,通常会有三个角色:

  1. 上下文(Context):它持有一个指向策略对象的引用,负责将请求委托给这个对象。
  2. 策略(Strategy):它是一个接口或抽象类,定义了一个算法族,使它们可以相互替换。
  3. 具体策略(Concrete Strategy):实现了策略接口的具体算法。

这种模式使得算法可以独立于其使用者而变化,同时也简化了算法的替换和扩展。通常情况下,策略模式在需要多种算法选择时非常有用,例如排序算法、数据压缩等。

下面举个实际的例子加深对策略模式的理解

示例

假设我们正在开发一个电商平台,需要根据不同的促销活动计算最终的价格。这是一个很好的策略模式的应用场景。

首先,我们定义一个 `PriceCalculator` 接口作为策略接口,其中包含了计算最终价格的方法。然后,我们创建具体的促销策略类,比如 `BlackFridayStrategy``CyberMondayStrategy``ClearanceSaleStrategy` 等,它们实现了 `PriceCalculator` 接口,并分别实现了不同的价格计算逻辑。

接着,我们有一个 `Checkout` 类作为上下文类,它接收不同的促销策略,并在结账时执行相应的策略来计算最终价格。

下面是一个简化的示例:

策略接口,每种策略都需要实现这个接口,并重写接口里的方法

复制代码
// 定义策略接口  
interface PriceCalculator {  
    double calculateFinalPrice(double initialPrice);  
}  

策略类,就是具体的策略,比如这里的每一种活动就是策略,再具体点就是周年庆活动的折扣和端午节活动的折扣是两种不同的策略

复制代码
// 具体策略类  
class BlackFridayStrategy implements PriceCalculator {  
    public double calculateFinalPrice(double initialPrice) {  
        return initialPrice * 0.5; // 50% off  
    }  
}  

class CyberMondayStrategy implements PriceCalculator {  
    public double calculateFinalPrice(double initialPrice) {  
        return initialPrice * 0.6; // 40% off  
    }  
}  

上下文类,这个类其实类似一个包装袋,袋子都是同一个袋子,但是袋子里的策略可以是不同的,最终运行的方法就是每个策略类里面重写的接口的方法

复制代码
// 上下文类  
class Checkout {  
    private PriceCalculator priceCalculator;  
  
    public Checkout(PriceCalculator priceCalculator) {  
        this.priceCalculator = priceCalculator;  
    }  
  
    public double calculateTotal(double initialPrice) {  
        return priceCalculator.calculateFinalPrice(initialPrice);  
    }  
}  

使用方式

复制代码
// 使用示例  
public class ShoppingCart {  
    public static void main(String[] args) {  
        double initialPrice = 100.0;  
  
        Checkout checkout = new Checkout(new BlackFridayStrategy());  
        System.out.println("Final price on Black Friday: $" + checkout.calculateTotal(initialPrice));  
  
        checkout = new Checkout(new CyberMondayStrategy());  
        System.out.println("Final price on Cyber Monday: $" + checkout.calculateTotal(initialPrice));  
    }  
}  

为了更好理解策略模式,一定要去代码里面运行一下感受一下策略模式的优雅

相关推荐
willow10 小时前
Axios由浅入深
设计模式·axios
七月丶2 天前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞2 天前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼2 天前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟3 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder3 天前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室3 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦4 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
西岸行者7 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习