设计模式-策略模式

一、策略模式简介

介绍

策略模式是一种行为设计模式,它能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。

应用场景:

  • 1.多个相关类只区别在表现行为不同:当一个系统需要动态地在几种算法或行为中选择一种时。
  • 2.避免使用多重条件选择语句(如if-else或switch-case):如果在一个系统中有很多条件判断语句,可以通过将这些判断分支封装成不同的策略类来避免代码的复杂性。
  • 3.可互换的算法:程序需要支持多种算法,并且这些算法可以在运行时互换。

为什么使用策略模式?

  • 提高灵活性:通过将算法封装在独立的类中,可以轻松地添加、移除或修改算法,而无需修改使用它们的类。
  • 易于扩展:增加新的策略只需实现接口即可,符合开闭原则。
  • 简化复杂逻辑:将复杂的条件判断逻辑分散到各个策略类中,使得主逻辑更加清。

二、设计思想和代码实现

设计思想:

  • step1.编写父类策略接口,定义行为方法。
  • step2.根据需要编写N个具体的策略接口的实现类。
  • step3.初始化 实现类到容器中(一般IOC容器)。
  • step4.在应用时根据标识符从容器中获取对应的处理器实例处理业务接口。

Java代码:

java 复制代码
// 如果不使用策略模式则需要类似如下写多个if ... else 代码,比较复杂,不容扩展,代码复用性低
doPremium(Vo vo){

if(vo.getCheckRule == 0){
    //3000 
} else if(vo.getCheckRule == 1){
    // 5000
} else if(vo.getCheckRule == 2){
    // 5000
} ...

示例:

在线购物平台,需要根据用户的不同会员等级提供不同的折扣策略。这里就可以使用策略模式来设计。

在使用的时候;亮出会员等级和购买商品的价格就可以得到这个等级对应的购买价格。

1)step1定义策略接口:

java 复制代码
package com.it.shop;

public interface DiscountStrategy {
    double calculate(double price);
}

2)step2.实现策略类:

普通会员折扣类 com.it.shop.NormalMemberDiscount

java 复制代码
package com.it.shop;

public class NormalMemberDiscount implements DiscountStrategy{
    @Override
    public double calculate(double price) {
        //普通会员折扣
        return price * 0.95;
    }
}

银牌会员折扣类 com.it.shop.SilverMemberDiscount

金牌会员折扣类 com.it.shop.GoldMemberDiscount

java 复制代码
package com.it.shop;

public class GoldMemberDiscount implements DiscountStrategy{
    @Override
    public double calculate(double price) {
        //金牌会员折扣
        return price * 0.85;
    }
}

可扩展性,可维护性很强;比如需要添加ssvip会员,更优惠。

添加,ssvip更优惠;

@service 注册到IOC容器;前端传和bean一样的名称;

3)step3.策略工厂(初始化):

4)step4.应用策略:

java 复制代码
 public static void main(String[] args) {
        while(true) {
           //system.out.println("请输入价格:");
            System.out.println("请输入会员等级:");
            Scanner scanner = new Scanner(System.in);
            String memberLevel = scanner.nextLine();
            System.out.println("请输入商品价格:");
            double price =  scanner.nextDouble();
            //根据传递的会员等级, 找到处理这个类型的处理类;
            //可扩展性,可维护性很强;
            DiscountStrategy discountStrategy = strategyMap.get(memberLevel);
            double discountprice = discountStrategy.calculate(price);
            System.out.println("会员等级为:"+memberLevel+",商品价格为:"+price+",会员折扣价格为:"+discountStrategy.calculate(price));

        }
    }
相关推荐
skywalk81632 小时前
esxi8 虚拟机中怎么安装mac os(纯AI回答,未实践)
策略模式·esxi
Yu_Lijing2 小时前
基于C++的《Head First设计模式》笔记——备忘录模式
c++·笔记·设计模式·备忘录模式
无籽西瓜a4 小时前
【西瓜带你学设计模式 | 第二期-观察者模式】观察者模式——推模型与拉模型实现、优缺点与适用场景
java·后端·观察者模式·设计模式
我真会写代码7 小时前
Java程序员常用设计模式详解(实战版)
java·开发语言·设计模式
廖圣平8 小时前
从零开始,福袋直播间脚本研究【八】《策略模式》
开发语言·python·bash·策略模式
无籽西瓜a8 小时前
【西瓜带你学设计模式 | 第一期-单例模式】单例模式——定义、实现方式、优缺点与适用场景以及注意事项
java·后端·单例模式·设计模式
cliffordl18 小时前
设计模式(python)
python·设计模式
云道轩20 小时前
告诉 Claude Code 在项目中遵循特定的编程模式/设计模式和技术栈约束
设计模式·ai·agent·claude code
花间相见1 天前
【Java基础面试题】—— 核心知识点面试题(含答案):语法+集合+JVM+设计模式+算法
java·jvm·设计模式
朱一头zcy1 天前
设计模式入门:最简单的模板方法模式
笔记·设计模式·模板方法模式