IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 设计模式 ---- 策略模式实践(二) -> 正文阅读

[Java知识库]设计模式 ---- 策略模式实践(二)

本來策略模式只写了上边一篇文章的,文章发出来以后经过大佬指导,代码可以更加简化,趁着今天有时间就按大佬的提示修改了一版,请各位品鉴(案例还是用上文的案例)。

废话少说,直接上代码

首先定义接口,接口中就只有一个方法了,即获取商品的促销价格。

package com.info.examples.strategy;

import java.math.BigDecimal;

public interface PromoteSalesService {

    /**
     * 获取商品促销价
     *
     * @param originalPrice 原价
     * @return 商品的促销价
     */
    BigDecimal getPromotionPrice(BigDecimal originalPrice);
}


实现接口

package com.info.examples.strategy;

import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * 打折促销
 */
@Service
public class DiscountPromoteServiceImpl implements PromoteSalesService {

    // 满100打9折,199以上打85折
    @Override
    public BigDecimal getPromotionPrice(BigDecimal originalPrice) {
        if (new BigDecimal("100").compareTo(originalPrice) > 0) {
            return originalPrice;
        } else if (new BigDecimal("199").compareTo(originalPrice) >= 0) {
            return originalPrice.multiply(new BigDecimal("0.9"));
        }
        return originalPrice.multiply(new BigDecimal("0.85"));
    }
}

package com.info.examples.strategy;

import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * 满减促销
 */
@Service
public class FullReductionPromoteServiceImpl implements PromoteSalesService {

    // 满 199 减 50
    @Override
    public BigDecimal getPromotionPrice(BigDecimal originalPrice) {
        if (new BigDecimal("199").compareTo(originalPrice) > 0) {
            return originalPrice;
        }
        return originalPrice.subtract(new BigDecimal("50"));
    }
}

定义一个促销方式的枚举

package com.info.examples.strategy;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 支持的促销方式枚举
 */
@AllArgsConstructor
@Getter
public enum PromoteTypeEnum {

    // 打折
    DISCOUNT("打折", new DiscountPromoteServiceImpl()),

    // 满减
    FULL_REDUCTION("满减", new FullReductionPromoteServiceImpl());

    private String desc;

    private PromoteSalesService service;

}

至此主体代码编写完毕,不再需要所谓的策略模式的上下文,可以开始测试。

package com.info.examples.controller;

import com.info.examples.strategy.PromoteSalesService;
import com.info.examples.strategy.PromoteStrategyFactory;
import com.info.examples.strategy.PromoteTypeEnum;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.Random;

@RestController
public class PromoteController {

    @GetMapping("/getPrice/{price:^[1-9]\\d*$|^(?>[1-9]\\d*\\.\\d{1,8})$}")
    public String getPromotePrice(@PathVariable String price) {
        PromoteTypeEnum promoteType = new Random().nextInt(100) > 50 ? PromoteTypeEnum.FULL_REDUCTION : PromoteTypeEnum.DISCOUNT;
        PromoteTypeEnum promoteType = new Random().nextInt(100) > 50 ? PromoteTypeEnum.FULL_REDUCTION : PromoteTypeEnum.DISCOUNT;
        BigDecimal promotionPrice = promoteType.getService().getPromotionPrice(new BigDecimal(price));
        return String.format("原价 %s 使用 %s 促销后价格为 %f", price, promoteType.getDesc(), promotionPrice.doubleValue());
    }
}

启动项目,打开浏览器输入http://localhost:8080/getPrice/200就可以进行测试啦。

可以看到,效果和之前是一样的,其实到这儿你会发现,具体的实现类我们也可以不需要,可以把具体的实现内容写到枚举里面,因此枚举类变成了这个样子:

package com.info.examples.strategy;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.math.BigDecimal;

/**
 * 支持的促销方式枚举
 */

@Getter
@AllArgsConstructor
public enum PromoteTypeEnum {

    // 打折
    DISCOUNT("打折", originalPrice -> {
        if (new BigDecimal("100").compareTo(originalPrice) > 0) {
            return originalPrice;
        } else if (new BigDecimal("199").compareTo(originalPrice) >= 0) {
            return originalPrice.multiply(new BigDecimal("0.9"));
        }
        return originalPrice.multiply(new BigDecimal("0.85"));
    }),

    // 满减
    FULL_REDUCTION("满减", originalPrice -> {
        if (new BigDecimal("199").compareTo(originalPrice) > 0) {
            return originalPrice;
        }
        return originalPrice.subtract(new BigDecimal("50"));
    });

    private String desc;

    private PromoteSalesService service;
}

好了今天的分享就到这里,打完收工!

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:57:54  更:2022-03-03 15:59:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:53:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码