ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

策略模式

2021-04-06 19:34:09  阅读:238  来源: 互联网

标签:策略 pay void 模式 IPay 支付 public String


策略模式是将定义的算法家族,分别封装起来,让它们可以互相替换,从而让算法的变化不会影响到使用算法的用户。
策略模式的本质就是面向对象继承和多态机制,满足同一方法在不同场景下不同的实现。解决多if else 的复杂情况。

应用场景

  1. 针对同一个产品,有多种类型,并且每种类型都有自身独特的实现。
  2. 算法需要自由切换
  3. 需要屏蔽算法规则。

使用案例

以淘宝购物付款为例,有通过微信支付、支付宝支付、银联支付等,并且每种支付的实现方式都不同。

  • 抽象支付接口
public interface IPay {

	/**
	 * 支付
	 */
	void pay();
}
  • 支付枚举类
public enum PayTypeEnum {
	WE_CHAT_PAY("weChat", "微信支付"),
	ALI_PAY("aliPay", "支付宝支付"),
	UNION_PAY("unionPay", "银联支付");

	private String code;
	
	private String name;
	
	PayTypeEnum(String code, String name) {
		this.code = code;
		this.name = name;
	}

	public String getCode() {
		return code;
	}

	public String getName() {
		return name;
	}
}
  • 支付实现类
public class WeChatPay implements IPay {

	@Override
	public void pay() {
		System.out.println("微信支付");
	}
}
public class AliPay implements IPay{
	
	@Override
	public void pay() {
		System.out.println("支付宝支付");	
	}
}
public class UnionPay implements IPay {
	
	@Override
	public void pay() {
		System.out.println("银联支付");	
	}
}
  • 策略类
public class PayStrategy {
	
	private static Map<String, IPay> payMap = new HashMap<>(4);

	private PayStrategy() {
	}

	static {
		payMap.put(PayTypeEnum.WE_CHAT_PAY.getCode(), new WeChatPay());
		payMap.put(PayTypeEnum.ALI_PAY.getCode(), new AliPay());
		payMap.put(PayTypeEnum.UNION_PAY.getCode(), new UnionPay());
	}
	
	public static IPay getInstance(String type) {
		if (payMap.containsKey(type)) {
			return payMap.get(type);
		}
		throw new RuntimeException("此支付方式正在开发ing");
	}
}
  • 测试类及执行结果
public class TestStrategy {

	public static void main(String[] args) {
		PayStrategy.getInstance("weChat").pay();
		PayStrategy.getInstance("aliPay").pay();
		PayStrategy.getInstance("unionPay").pay();
	}
}
/*
 微信支付
 支付宝支付
 银联支付
*/

Spring中使用策略模式

在Spring中,Spring帮我们管理了Bean的创建和销毁,策略如何使用呢?
利用Spring的@Qualifier("")注解
  • 抽象接口
public interface IPay {

	/**
	 * 支付
	 */
	void pay();
}
  • 实现类
@Service
@Qualifier("weChat")
public class WeChatPay implements IPay {

	@Override
	public void pay() {
		System.out.println("微信支付");
	}
}
@Service
@Qualifier("aliPay")
public class AliPay implements IPay{
	
	@Override
	public void pay() {
		System.out.println("支付宝支付");	
	}
}
@Service
@Qualifier("unionPay")
public class UnionPay implements IPay {
	
	@Override
	public void pay() {
		System.out.println("银联支付");	
	}
}
  • 策略类
    直接利用Spring的@Autowired机制,配合实现类的@Qualifier注解,将多个实现类抽象成一个map
@Service
public class PayStrategySpring {
	
	@Autowired
	private Map<String, IPay> payMap = new HashMap<>(4);
	
	public IPay getInstance(String type) {
		if (payMap.containsKey(type)) {
			return payMap.get(type);
		}
		throw new RuntimeException("功能正在开发ing");
	}
}
  • Controller调用
@RestController
public class PayController {
	
	@Autowired
	private PayStrategySpring payStrategySpring;
	
	@GetMapping("/test")
	public void test(@RequestParam String type) {
		payStrategySpring.getInstance(type).pay();
	}
}

浏览器输入http://localhost:8089/test?type=aliPay,即可自动执行想要的实现类。

策略模式优缺点

  • 优点
    策略模式符合开闭原则。
    避免过多使用if else。
    使用策略模式可以提高算法的保密性和安全性。
  • 缺点
    代码会增加过多的类,增加维护难度。

标签:策略,pay,void,模式,IPay,支付,public,String
来源: https://www.cnblogs.com/ns-study/p/14623315.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有