设计模式之策略模式
定义
策略模式定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换
使用场景
当你写代码的时候发现一个操作有好多种实现方法,而你需要根据不同的情况使用
if-else
等分支结构来确定使用哪种实现方式的时候,想一想这个模式。
普通实现
如果我们正常写代码,平时也应该这样,首先保证把功能正确的实现了,然后慢慢重构,设计模式都是在不断的重构当中应用的。 王二狗会调用会调用
goToTianJinEye()
方法,根据自己的实际情况,选择某一种出行方式。public class TrafficFeeCalculator { public int goToTianJinEye(String way, int distance) { int trafficFee = 0; switch (way) { case "bus": if (distance < 10) trafficFee = 4; else trafficFee = 6; break; case "didi": if(distance<3) trafficFee = 8; else trafficFee=8+(distance-3)*3; break; case "sharedBicyle": trafficFee = 2; break; default: break; } return trafficFee; } }
那么这么写有什么弊端呢? 第一:每一种出行方式的交通花费的计算方式都写在了
TrafficFeeCalculator
类中,这个类承担的职责较多,违反了单一职责原则。 第二:假如王二狗突然想自己开车去,那就需要修改goToTianJinEye
这个方法了。违反了开闭原则。策略模式实现
public interface CalculateStrategy { int calculateTrafficeFee(int distance); } class Bus implements CalculateStrategy { @Override public int calculateTrafficeFee(int distance) { return Math.min(10, distance); } } class Gaode implements CalculateStrategy { @Override public int calculateTrafficeFee(int distance) { return Math.max(distance, 20); } } class SharedDibai implements CalculateStrategy { @Override public int calculateTrafficeFee(int distance) { return 2; } } class TrafficeFeeCalculate{ public int goTianAnMen(CalculateStrategy calculateStrategy, int distance) { return calculateStrategy.calculateTrafficeFee(distance); } public static void main(String[] args) { TrafficeFeeCalculate trafficeFeeCalculate = new TrafficeFeeCalculate(); int i = trafficeFeeCalculate.goTianAnMen(new Bus(), 10); System.out.println("公交车"+i); int i1 = trafficeFeeCalculate.goTianAnMen(new Gaode(), 10); System.out.println("打高德"+i1); } }优缺点
优点:降低了算法类的职责,使各个算法可以独立变化并互相替换。而且使得增加新的算法变的很容易,降低了对原有系统的侵入,最终使得程序可扩展可维护性增强。
缺点:所有设计模式的通病,类增多了,程序从局部来看变的更复杂了。
总结
是不是感觉讲设计模式的文章都有一个特点,使用了设计模式反而比不使用设计模式使程序看起来更加复杂,而不是更加简单。那是因为每篇文章的示例都是无实际使用意义的示例代码,实际情况是程序非常复杂才需要使用到设计模式。一个大型程序是不断迭代出来的,一开始肯定不长那样,程序员日常接到一个开发任务也不要过多的想,这个我应该用个什么设计模式呀?先把功能实现了,然后回头看看有没有遵循面向对象编程6大原则,如果没有想想怎么改进,然后设计模式就登场了。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话