策略模式的简单妙用理解

1 场景导入

先不扯虚的,先看策略模式常用的应用可以消除一堆恶心的if else

以加减乘除为例:

1.1 不用策略模式

before不用策略模式

public class Main {

	public static void main(String[] args) {
		String operator = "+";
		int a = 10;
		int b = 5;
		int result = 0;
		
		if ("+".equals(operator)) {
			result = add(a,b);
		} else if ("-".equals(operator)) {
			result = sub(a,b);
		} else if ("*".equals(operator)) {
			result = mul(a,b);
		} else {
			result = div(a,b);
		}
		
		System.out.println("结果是:" + result);
		
	}

	static int add(int a, int b) {
		return a + b;
	}
	
	static int sub(int a, int b) {
		return a - b;
	}
	
	static int mul(int a, int b) {
		return a * b;
	}
	static int div(int a, int b) {
		if (b == 0) throw new RuntimeException("除数不能为0");
		return a / b;
	}
}

输出结果
在这里插入图片描述
中间一堆if else看着不舒服而且会随着运算符的变多,变得越来越长
在这里插入图片描述

1.2 after用了策略模式

package per.blacksnow.strategy.example.ifelse.my.after;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

// 测试类
public class Main {

	public static void main(String[] args) {
		OperatorStrategy strategy = new AddStrategy();
		int a = 10;
		int b = 5;
		int result = 0;
		
		Context context = new Context();
		context.setStrategy(strategy);
		result = context.operate(10, 5);
		System.out.println("结果是:" + result);
	}
	
}

// 抽象策略(Strategy)类
interface OperatorStrategy {

	int operate(int a, int b);
	
}


// 具体策略(Concrete Strategy)类
class AddStrategy implements OperatorStrategy{

	@Override
	public int operate(int a, int b) {
		return a + b;
	}

}

// 具体策略(Concrete Strategy)类
class SubtractStrategy implements OperatorStrategy{

	@Override
	public int operate(int a, int b) {
		return a - b;
	}
	
}


// 环境(Context)类
@Data
@NoArgsConstructor
@AllArgsConstructor
class Context {

	OperatorStrategy strategy;
	
	public int operate(int a, int b) {
		return strategy.operate(a, b);
	}
	
}

在这里插入图片描述
在这里插入图片描述
if else不见了,而且扩展性也好,只要添加各种Strategy,然后设置想要的策略即可

2 UML图

在这里插入图片描述

3 模式的角色

3.1 抽象策略类

定义一个上层接口,所有不同的策略都要对这个接口中定义的方法进行各自的算法实现,比如都要进行对operate方法进行实现

3.2 具体策略类

实现具体的算法,比如AddStrategy实现加法,SubtructStrategy实现减法等

3.3 环境类

持有策略类的引用,通过这个引用来给客户端进行调用

4 应用场景

  • 系统中各算法彼此独立,需要在运行时动态地在几种算法中选择一种
  • 消除if-else
  • 需要对客户端隐藏具体的算法细节,客户端只要知道有什么算法就行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值