设计模式-策略模式

一、策略模式简介

介绍

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

应用场景:

  • 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));

        }
    }
相关推荐
沛沛老爹1 天前
Vue3+TS实战:基于策略模式的前端动态脱敏UI组件设计与实现
前端·ui·vue3·数据安全·策略模式·动态渲染·前端脱敏
全栈前端老曹1 天前
【Redis】发布订阅模型 —— Pub/Sub 原理、消息队列、聊天系统实战
前端·数据库·redis·设计模式·node.js·全栈·发布订阅模型
资深web全栈开发1 天前
设计模式之桥接模式 (Bridge Pattern)
javascript·设计模式·桥接模式
小温冲冲2 天前
通俗且详细讲解模板方法模式
设计模式·模板方法模式
reddingtons2 天前
Magnific AI:拒绝“马赛克”?AI 幻觉重绘流,拯救 1024px 废片
图像处理·人工智能·设计模式·新媒体运营·aigc·设计师·教育电商
知无不研2 天前
c++的设计模式(常用)
c++·观察者模式·单例模式·设计模式·简单工厂模式
李广坤2 天前
设计模式的本质:隔离变化
后端·设计模式
河码匠2 天前
设计模式之依赖注入(Dependency Injection)
java·设计模式·log4j
小湘西2 天前
互联网黑话持续更新
其他·设计模式