浅谈23种设计模式之策略设计模式
策略模式
1、简介
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如对于上班族来说,每周都会去公司上班,那么我们去公司的方式有多种多样,比如我们可以选择步行,骑单车,开车或者坐公交车等。再比如我们的高德导航系统,在提供导航服务的时候会根据客户需求的不同提供相应的导航策略,比如步行导航,开车导航等。下面看一个关于策略模式的类图
2、应用场景
应用场景:
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
3、优缺点
优点
- 算法可以自由切换
- 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
- 扩展性良好,增加一个策略只需实现接口即可
缺点
- 策略类数量会增多,每个策略都是一个类,复用的可能性很小
- 所有的策略类都需要对外暴露
4、具体实现
下面就写一个简单的去公司上班的demo来加以说明
1.策略角色
/**
*
* 定义行为或者功能,在这里我的行为就是去公司,每个策略或算法必须具有的方法和属性
*/
public abstract class Strategy {
//去公司
abstract void gotoCompany();
}
2.上下文Context
/**
*
* Context上下文角色,或者Context封装角色,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化
*/
public class Context {
//持有策略的引用
private Strategy strategy;
public Context() {
this.strategy = null;
}
//灵活配置策略
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
//根据不同的策略调用不同的行为
public void contextInterface() {
strategy.gotoCompany();
}
}
3.具体策略角色
/**
*
* 步行去公司
*/
public class Walk extends Strategy{
@Override
void gotoCompany() {
System.out.println("今天天气好我步行去公司");
}
}
/**
*
* 开车去公司
*/
public class Drive extends Strategy {
@Override
void gotoCompany() {
System.out.println("今天下雨我开车去公司");
}
}
4. Client客户端
在这里我们可以根据需要选择不同的策略,也就是暴露给用户可选的策略
public class Client {
public static void main(String[] args) {
Context context = new Context();
//配置具体策略
context.setStrategy(new Drive());
//行为或功能
context.contextInterface();
//配置具体策略
context.setStrategy(new Walk());
//行为或功能
context.contextInterface();
}
}
5. 测试结果打印
初次学习,欢迎大家批评指正,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用