Java设计模式之工厂模式以及策略模式整合SpringBoot

Java设计模式之工厂模式以及策略模式整合SpringBoot

  • 1.工厂模式与策略模式
  • 2.话不多说,上代码
    • 2.1利用idea创建SpringBoot+Maven工程。
    • 2.2工程代码场景
    • 2.3微信支付实现:
    • 2.4支付宝支付实现:
    • 2.5银联支付实现:
    • 2.6工厂方法:
    • 2.7开放Rest支付接口
    • 浏览访问传入不同的支付参数,返回不同的支付方式结果

1.工厂模式与策略模式

工厂模式:用来创建不同的对象,关注创建型模式。
策略模式:用来执行不同的行为,关注行为的模式。

2.话不多说,上代码

2.1利用idea创建SpringBoot+Maven工程。

2.2工程代码场景

实际生活当中,各种平台存在支付,支付的时候,支付方式为用户自动选择,是微信支付,还是支付宝支付,还是说银联支付呢?
那么这个时候,工厂模式+策略模式就派上用场了,我们通过用户的选择来实现不同的支付算法。代码如下:
抽象支付接口:

package com.lucas.designpattern.service;

/**
 * @program:com.lucas.designpattern.service
 * @descrption:支付抽象接口
 * @author:Lucas.li
 * @create: 2020-01-09 23:16
 */
public interface PayService {

    String pay();
}

2.3微信支付实现:

package com.lucas.designpattern.service.impl;

import com.lucas.designpattern.service.PayService;
import org.springframework.stereotype.Service;


/**
 * @program:com.lucas.designpattern.service.impl
 * @descrption:微信支付类
 * @author:Lucas.li
 * @create: 2020-01-09 23:18
 */
@Service("WECHATPAY")
public class WechatPayServiceImpl implements PayService {
    @Override
    public String pay() {
        return "微信支付成功";
    }
}

2.4支付宝支付实现:

package com.lucas.designpattern.service.impl;

import com.lucas.designpattern.service.PayService;
import org.springframework.stereotype.Service;

/**
 * @program:com.lucas.designpattern.service.impl
 * @descrption:支付宝支付类
 * @author:Lucas.li
 * @create: 2020-01-09 23:19
 */
@Service("ALIPAY")
public class AliPayServiceImp implements PayService {
    @Override
    public String pay() {
        return "支付宝支付成功";
    }
}

2.5银联支付实现:

package com.lucas.designpattern.service.impl;

import com.lucas.designpattern.service.PayService;
import org.springframework.stereotype.Service;

/**
 * @program:com.lucas.designpattern.service.impl
 * @descrption:银联支付实现类
 * @author:Lucas.li
 * @create: 2020-01-09 23:21
 */
@Service("UNIONPAY")
public class UnionPayServiceImpl implements PayService {
    @Override
    public String pay() {
       return "银联支付成功";
    }
}

2.6工厂方法:

package com.lucas.designpattern.fatory;

import com.lucas.designpattern.service.PayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @program:com.lucas.designpattern.fatory
 * @descrption: 支付工厂类
 *
 * @author:Lucas.li
 * @create: 2020-01-09 23:43
 */
@Component
public class PayFactory {

    /**
     * 将多个的支付实现注入到一个map当中,key为声明的名字,value为具体的支付实现
     */
    @Autowired
    private Map<String,PayService> payServiceMap;

    public PayService createPay(String type){
        return payServiceMap.get(type);
    }

}

2.7开放Rest支付接口

package com.lucas.designpattern.web;
import com.lucas.designpattern.fatory.PayFactory;
import com.lucas.designpattern.service.PayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program:com.lucas.designpattern.web
 * @descrption:支付开放接口
 * 利用Spring自动注入及工厂模式+策略模式进行注入实现不同的支付方式
 *
 * @author:Lucas.li
 * @create: 2020-01-09 23:40
 */
@RestController
@RequestMapping("/pay")
public class RestPayController {

    @Autowired
    private PayFactory payFactory;//工厂类

    @RequestMapping(value = "pay",method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public String pay(String type){
        PayService payService= payFactory.createPay(type);
        return payService.pay();
    }
}

浏览访问传入不同的支付参数,返回不同的支付方式结果

微信支付:http://localhost:8080/pay/pay?type=WECHATPAY
支付宝支付:http://localhost:8080/pay/pay?type=ALIPAY
银联支付:http://localhost:8080/pay/pay?type=UNIONPAY

你可能感兴趣的:(java,SpringMVC)