设计模式-策略模式

一、策略模式简介

介绍

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

应用场景:

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

        }
    }
相关推荐
nnsix1 天前
设计模式 - 建造者模式 笔记
笔记·设计模式·建造者模式
cui17875681 天前
矩阵拼团 + 复购拼团:新零售最稳的复购模式,规则简单
大数据·人工智能·设计模式·零售
百珏1 天前
[灰度发布]:全链路透传组件:APM、自研方案与 Java Agent 的实现取舍
后端·设计模式·架构
likerhood1 天前
设计模式 · 享元模式(Flyweight Pattern)java
java·设计模式·享元模式
AI大法师1 天前
从 Adobe 焕新看品牌系统升级:Logo、主色、字体与产品体验如何重新对齐
大数据·人工智能·adobe·设计模式
贵慜_Derek1 天前
《从零实现 Agent 系统》连载 03|控制循环:感知—决策—行动—反思
人工智能·设计模式·架构
nnsix1 天前
设计模式 - 原型模式 笔记
笔记·设计模式·原型模式
nnsix1 天前
设计模式 - 适配器模式 笔记
笔记·设计模式·适配器模式
asdfg12589631 天前
一文理解软件开发中的“设计模式”
java·设计模式·软件开发
云飞云共享云桌面1 天前
SolidWorks 服务器通过云飞云共享云桌面10人研发共享方案
运维·服务器·3d·设计模式·电脑