所有分类
  • 所有分类
  • 未分类

策略模式Java实战–写法1:手动组装Map

简介

说明

本文介绍Java中策略模式的写法:手动组装Map。

本文通过抽象类来实现策略模式:接口+不同的实现类,通过Map来手动添加和获取实现类。

本写法的优缺点

优点

  1. 纯手写,有利于理解策略模式。

缺点

  1. 策略是手动注册的,不是自动注册。
  2. 添加新的策略时,要新建一个策略实现类,还要去手动注册。(手动注册这一步破坏了开闭原则)
  3. 策略持有者里边持有的是实现类。

实战

项目需求

有不同的支付方式:支付宝、微信、银行卡,前端传了一个payType,根据payType去判断调用哪种支付方式。

 思路

  1. 提供一个支付功能接口,不同的支付方式去实现这个接口
  2. 创建一个Map,key为支付类型,value为实现类的引用,手动将所有的实现类放进去。
  3. 执行时:根据支付方式从Map中取出对应的实现类,调用支付方法。

代码结构

源码地址

此隐藏内容仅限VIP查看升级VIP

支付类型枚举类

package com.knife.designPattern.constant;
 
public enum PayType {
    ALIPAY("支付宝支付"),
    WECHAT_PAY("微信支付"),
    BANK_CARD_PAY("银行卡支付")
    ;
 
    /**
     * 描述
     */
    private final String description;
 
    PayType(String description) {
        this.description = description;
    }
 
    public String getDescription() {
        return description;
    }
}

抽象策略(支付)

package com.knife.designPattern.strategy;
 
public interface Pay {
    /**
     * 调用远程的支付接口
     */
    void invokeRemoteInterface();
}

具体策略

支付宝支付策略

package com.knife.designPattern.strategy.impl;


import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.Pay;

public class AliPayImpl implements Pay {
 
    @Override
    public void invokeRemoteInterface() {
        System.out.println("调用远程接口:" + PayType.ALIPAY.getDescription());
    }
}

微信支付策略

package com.knife.designPattern.strategy.impl;

import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.Pay;

public class WeChatPayImpl implements Pay {
 
    @Override
    public void invokeRemoteInterface() {
        System.out.println("调用远程接口:" + PayType.WECHAT_PAY.getDescription());
    }
}

银行卡支付策略

package com.knife.designPattern.strategy.impl;

import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.Pay;

public class BankCardPayImpl implements Pay {
 
    @Override
    public void invokeRemoteInterface() {
        System.out.println("调用远程接口:" + PayType.BANK_CARD_PAY.getDescription());
    }
}

支付策略持有类

package com.knife.designPattern.strategy;
 
import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.impl.AliPayImpl;
import com.knife.designPattern.strategy.impl.BankCardPayImpl;
import com.knife.designPattern.strategy.impl.WeChatPayImpl;

import java.util.HashMap;
import java.util.Map;
 
public class PayStrategyHolder {
    private static Map<PayType, Pay> payMap = null;
 
    static {
        payMap = new HashMap<>();
        payMap.put(PayType.ALIPAY, new AliPayImpl());
        payMap.put(PayType.WECHAT_PAY, new WeChatPayImpl());
        payMap.put(PayType.BANK_CARD_PAY, new BankCardPayImpl());
    }
 
    public static void pay(PayType payType) {
        for (Map.Entry<PayType, Pay> payEntry : payMap.entrySet()) {
            if (payEntry.getKey().equals(payType)) {
                payEntry.getValue().invokeRemoteInterface();
            }
        }
    }
}

测试 

代码

package com.knife.designPattern.controller;

import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.PayStrategyHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class PayController {
    @GetMapping("/pay")
    public String pay(PayType payType) {
        PayStrategyHolder.pay(payType);
        return "test success";
    }
}

测试

访问:http://localhost:8080/pay?payType=ALIPAY

后端结果

调用远程接口:支付宝支付
1

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录