JAVA设计模式之策略模式

基本概念

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。策略模式的关键在于定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

类图

在策略模式类图中包含如下几个角色:

Context(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。

Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。

ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

代码实现

使用策略模式实现加减乘除四则运算。

抽象策略类[Strategy.java]

java 复制代码
public interface Strategy {
	int calculate(int x, int y);
}

加法策略[AddStrategy.java]

java 复制代码
public class AddStrategy implements Strategy {
	@Override
	public int calculate(int x, int y) {
		return x + y;
	}
}

减法策略[SubtractStrategy.java]

java 复制代码
public class SubtractStrategy implements Strategy {
	@Override
	public int calculate(int x, int y) {
		return x - y;
	}
}

乘法策略[MultiplyStrategy.java]

java 复制代码
public class MultiplyStrategy implements Strategy {
	@Override
	public int calculate(int x, int y) {
		return x * y;
	}
}

除法策略[DivideStrategy.java]

java 复制代码
public class DivideStrategy implements Strategy {
	@Override
	public int calculate(int x, int y) {
		return x / y;
	}
}

环境类[Context.java]

java 复制代码
public class Context {
	private Strategy strategy;
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	public int calculate(int x, int y) {
		return strategy.calculate(x, y);
	}
	public void setStrategy(Strategy strategy) {
		this.strategy = strategy;
	}
}

测试类[Client.java]

java 复制代码
public class Client {
	public static void main(String[] args) {
		Context context = new Context(new AddStrategy());
		System.out.println("9 + 3 = " + context.calculate(9, 3));
		context.setStrategy(new SubtractStrategy());
		System.out.println("9 - 3 = " + context.calculate(9, 3));
		context.setStrategy(new MultiplyStrategy());
		System.out.println("9 * 3 = " + context.calculate(9, 3));
		context.setStrategy(new DivideStrategy());
		System.out.println("9 / 3 = " + context.calculate(9, 3));
	}
}

运行结果

9 + 3 = 12

9 - 3 = 6

9 * 3 = 27

9 / 3 = 3

相关推荐
Brookty13 小时前
【算法】前缀和
java·学习·算法·前缀和·动态规划
少许极端14 小时前
算法奇妙屋(七)-字符串操作
java·开发语言·数据结构·算法·字符串操作
懒羊羊不懒@14 小时前
Java基础语法—字面量、变量详解、存储数据原理
java·开发语言
望获linux14 小时前
【实时Linux实战系列】实时 Linux 的自动化基准测试框架
java·大数据·linux·运维·网络·elasticsearch·搜索引擎
Code blocks14 小时前
GB28181视频服务wvp部署(一)
java·spring boot·后端
我命由我1234514 小时前
Spring Boot - Spring Boot 静态资源延迟响应(使用拦截器、使用过滤器、使用 ResourceResolver)
java·spring boot·后端·spring·java-ee·intellij-idea·intellij idea
Xzh042314 小时前
前后端学习的交界
java·ajax·maven·axios·测试
豆沙沙包?15 小时前
2025年--Lc201- 378. 有序矩阵中第 K 小的元素(排序)--Java版
java·线性代数·矩阵
华仔啊15 小时前
3 分钟让你彻底搞懂 Spring 观察者和发布者模式的本质区别
java·后端
没有bug.的程序员15 小时前
服务治理与 API 网关:微服务流量管理的艺术
java·分布式·微服务·架构·wpf