当前位置: 首页 > news >正文

山西省工程建设标准定额网站世界网站流量排名

山西省工程建设标准定额网站,世界网站流量排名,烟台建站程序,建立免费网站优化if-else的几种方式 策略模式1、创建支付策略接口2、书写不同的支付方式逻辑代码微信支付QQ支付 3、service层的实现类使用4、controller层的调用说明 枚举与策略模式结合1、创建枚举2、service层书写处理方法3、controller层调用4、说明 Lambda表达式与函数接口说明 策略模…

优化if-else的几种方式

  • 策略模式
    • 1、创建支付策略接口
    • 2、书写不同的支付方式逻辑代码
      • 微信支付
      • QQ支付
    • 3、service层的实现类使用
    • 4、controller层的调用
    • 说明
  • 枚举与策略模式结合
    • 1、创建枚举
    • 2、service层书写处理方法
    • 3、controller层调用
    • 4、说明
  • Lambda表达式与函数接口
    • 说明

策略模式

策略模式允许在运行时选择算法。策略模式是将算法定义成独立的类,并在运行时动态选择要使用的具体的算法,以此来避免多个if-else或switch语句的使用。
下面以支付功能为例子进行说明。
假设我们有一个支付系统,支持微信、QQ等多种支付方式。用户在支付时会选择自己需要的支付方式,后台功能接口中接收到用户的支付方式选择时,会进行不同的处理。在这里会产生if-else或者switch。如何使用策略模式来消除这些if-else的使用,下面示例说明。

1、创建支付策略接口

/*** 支付策略*/
public interface PaymentStrategy {void pay(double amount);}

2、书写不同的支付方式逻辑代码

微信支付

import org.springframework.stereotype.Component;@Component
public class WeiXinPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("微信支付" + amount);}
}

QQ支付

import org.springframework.stereotype.Component;@Component
public class QQPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("QQ支付" + amount);}
}

3、service层的实现类使用

import com.hysoft.study.service.PaymentStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;/*** 支付实现类*/
@Service
public class PaymentServiceImpl {private final Map<String, PaymentStrategy> strategies;@Autowiredpublic PaymentServiceImpl(List<PaymentStrategy> paymentStrategies){this.strategies = paymentStrategies.stream().collect(Collectors.toMap(s -> s.getClass().getSimpleName().toLowerCase(), Function.identity()));}public void processPayment(String strategyName,double amount){PaymentStrategy strategy = strategies.getOrDefault(strategyName,null);if (strategy != null){strategy.pay(amount);}else {throw new IllegalArgumentException("Strategy not found" + strategyName);}}}

4、controller层的调用

import com.hysoft.study.service.impl.PaymentServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("payment")
public class PaymentController {@Autowiredprivate PaymentServiceImpl paymentService;@PostMapping("test")public void test(String paymentname,double amount){this.paymentService.processPayment(paymentname,amount);}}

说明

需要注意的是,controller层调用service层实现方法的适合,传递了参数paymentname(支付方式),这个支付方式需要提前和前端调用人员协商好,这里的名称是各种支付方式的bean名称,在service处理中已经有所体现

在这里插入图片描述
因此在这里名称传值可以是qqpayment或weixinpayment。因此传值需要提前和前端进行协商。

枚举与策略模式结合

枚举类型不仅可以用来表示一组常量,还可以定义与这些常量相关联的行为。结合策略模式,可以进一步简化代码。

1、创建枚举

public enum OrderStatus {NEW {@Overridepublic void process () {System.out.println("处理新建订单");}},PAID {@Overridepublic void process () {System.out.println("订单已支付");}},UNPAD {@Overridepublic void process() {System.out.println("订单未支付");}};public abstract void process();
}

2、service层书写处理方法

import com.hysoft.study.model.OrderStatus;
import org.springframework.stereotype.Service;@Service
public class OrderServiceImpl {public void handleOrder(OrderStatus status) {status.process();}}

3、controller层调用

import com.hysoft.study.model.OrderStatus;
import com.hysoft.study.service.impl.OrderServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("order")
public class OrderController {@Autowiredprivate OrderServiceImpl orderService;@PostMapping("test")public void test(String status){OrderStatus aNew = OrderStatus.valueOf(status);this.orderService.handleOrder(aNew);}}

4、说明

controller层调用时传输的参数status即使在枚举中的各常量,例如NEW或者PAID、UNPAD等

Lambda表达式与函数接口

以下示例在service层实现类中直接书写了不同vip等级的结算金额的逻辑
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;@Service
public class StreamServiceImpl {private final Map<String, Function<Double, Double>> discountFunctions = new HashMap<>();public StreamServiceImpl() {discountFunctions.put("VIP1", e -> e * 0.95);discountFunctions.put("VIP2", e -> e * 0.95 - 20);}public double applyDiscount(String vipname, double price) {Double apply = discountFunctions.getOrDefault(vipname, Function.identity()).apply(price);return apply;}
}

在controller层调用时,需要传入vip等级和总计算金额,计算结果时打折后金额

import com.hysoft.study.service.impl.StreamServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("stream")
public class StreamController {@Autowiredprivate StreamServiceImpl streamService;@PostMapping("test")public double test(String vipname,Double price){return this.streamService.applyDiscount(vipname,price);}}

说明

传参vipname的值应参考service层类中的vip参数

在这里插入图片描述

http://www.yayakq.cn/news/34471/

相关文章:

  • 海外推广营销系统seo推广培训班
  • 网站开发税率网站内容建设的原则是什么样的
  • 广州快速建站公司推荐江西建筑培训网
  • 做外贸是哪里网站wordpress applyfilters
  • 网站建设和电子商务的关系网站做md5脚本
  • 网站建设浦东重庆市建设工程管理协会网站
  • 网站qq登录原理湛江电气建站软件
  • 阳泉市编办网站三基建设网络公司网站程序
  • 热度网络网站建设做系统用哪个网站好
  • 未来中森网站建设公司vs 2008 建立网站
  • 做天猫网站多少钱wordpress积分购买
  • 岳阳网站开发网站运营装修网站推广方案
  • 中型网站开发周期开源程序做网站
  • 做暧暖网站在线考试响应式网站模板下载
  • 代理网站推荐网站建设dqcx
  • 做护肤的网站有哪些股票配资网站建设
  • 贵阳市做网站的公司商业门户网站是什么意思
  • 鹤壁建设网站推广公司企业免费oa管理系统
  • 湘潭网站建设 很好磐石网络四川交投建设招标网站
  • 网站建站网站建设网站服务器怎么启动
  • 企业 网站 建设 规范网络营销方式优缺点
  • 网站空间就是主机吗网站的二级导航怎么做
  • 襄阳网站seo方法制作京东一样的网站
  • 国内有多少家做网站的企业seo查询seo
  • 博罗县建设局网站厦门正规网站建设多少
  • 唐山的谁会建网站专业建站公司报价
  • 在线做网站教程品牌建设论文参考文献
  • 阜宁网站制作费用建站网站数据搜索
  • 网站搭建哪里找有名气管理网站建设哪家公司好
  • 网站模板编辑工具来宾网站制作公司