一天一个设计模式:策略模式
概念:
策略模式属于对象的行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响客户端的情况下变化。
结构:
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包含具体场景的算法。
代码示例:
环境角色:

public class Context { //持有一个具体策略的对象 private Strategy strategy; /** * 构造函数,传入一个具体策略对象 * @param strategy 具体策略对象 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.strategyInterface(); } }
抽象策略类:

public interface Strategy { /** * 策略方法 */ public void strategyInterface(); }
具体策略类:

public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { //相关的业务 } } //后面两个重复这个类
使用常见:
我们以手抓饼订单为例,即有普通手抓饼,高级手抓饼,顶级手抓饼。
场景就是接单类,根据具体的算法来生产不同的手抓饼订单。
接单类:

public class ReceiveOrder { private ShouzhuabingOrder shouzhuabingOrder; public ReceiveOrder(ShouzhuabingOrder shouzhuabingOrder) { this.shouzhuabingOrder = shouzhuabingOrder; } //其实这我们可以对该函数进行一些功能强化,让其在算法选择的基础上进行一些功能的扩展 //具体的可以参考java中Collections类下面的sort方法。 //例如我们可以通过参数作为输入,相当于用户除了做定制化的手抓饼外,还可以再次基础上进行个性化的定制。 public String makeOrder() { return shouzhuabingOrder.makeOrder(); } }
手抓饼订单接口:

public interface ShouzhuabingOrder { public String makeOrder(); }
普通手抓饼:

public class OriginOrder implements ShouzhuabingOrder { @Override public String makeOrder() { return "我是基础的手抓饼,只有一张饼,一个蛋还有各种酱"; } }
高档手抓饼:

public class MediumOrder implements ShouzhuabingOrder { @Override public String makeOrder() { return "我是一个中级手抓饼,自带一张饼,两个蛋,还有自制酱料"; } }
豪华手抓饼:

public class HighOrder implements ShouzhuabingOrder { @Override public String makeOrder() { return "我是高级手抓饼,我有一张饼,两个蛋,一个里脊,一个薄脆还有自制酱料。"; } }
实际的接受订单的过程:

public class Test { public static void main(String[] args) { HighOrder highOrder = new HighOrder(); ReceiveOrder receiveOrder = new ReceiveOrder(highOrder); System.out.println(receiveOrder.makeOrder()); } }
策略模式的核心:
不管算法的实现,而是对算法做一个选择,组织,调用,从而使程序在结构上更加清晰,也更加方便维护和扩展。
策略模式的平等性:
算法的地位相同,可以相互替换,相互无依赖,策略模式中的算法关系未:相同行为的不同实现。
策略模式运行时的唯一性:
运行时,每一个时刻只能使用一个具体的策略实现对象,虽然可以动态切换,但是在同一时刻,只能是一个。
共有行为:
若所有算法均有具体的行为,可以将算法接口改成抽象类,同时共有的行为进行定义。
策略模式的优点:
1.策略模式提供了管理相关算法的算法族的方法,可以将部分共有代码移到父类,从而避免重复。
2.使用策略模式,可以避免重复条件的判定(if-else)。
策略模式的缺点:
1.客户端必须知道所有的策略,并自行决定使用哪种策略,以便选用合适的算法。(我还没有想明白这点,这自行判断还不是要依赖if else)
2.备选的策略多的话,类的数量会很多,不方便管理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!