首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
动物园里有什么-策略模式
📅 2026/9/29 3:37:45
✍️ 爱科研究院
👁 阅读 3,247
动物园里有什么呢有狮子老虎大象还有饲养员还有游客还有还有就是设计模式。为什么还有设计模式呢我们就先从入园开始来一场娱乐与学习的盛宴吧。入园要先买票买票可以售票处买也可以小程序买也可以App买那就出现了这样的场景同一个动作「买票」有多种独立的算法 / 实现售票处窗口买票、小程序买票、App买票可以动态切换各个方案之间不存在自动流转。这种就是策略模式。策略模式定义定义一系列算法把每一个算法封装起来并且让它们可以互相替换。算法独立于使用它的客户端而变化。结构图角色策略接口定义算法方法具体策略实现策略接口并重写算法方法Context持有策略的引用在方法中调用的策略引用的方法。示例用策略模式写出动物园买票的案例。// 策略接口 public interface Strategy { void buyTicket(); } // 售票口 public class TicketWindowStrategy implements Strategy { Override public void buyTicket() { System.out.println(到动物园售票口买票); } } // 小程序 public class MiniProgramStrategy implements Strategy { Override public void buyTicket() { System.out.println(使用动物园小程序买票); } } // APP public class AppStrategy implements Strategy { Override public void buyTicket() { System.out.println(使用动物园App买票); } } // Context public class Context { private Strategy strategy; public Context(Strategy strategy) { if(strategy null){ throw new IllegalArgumentException(策略不能为null); } this.strategy strategy; } public void setStrategy(Strategy strategy) { if(strategy null){ throw new IllegalArgumentException(策略不能为空); } this.strategy strategy; } public void executeBuyTicket() { strategy.buyTicket(); } } // 测试 public class TicketMain { public static void main(String[] args) { Context context new Context(new TicketWindowStrategy()); context.executeBuyTicket(); // 通过set方法改变策略 context.setStrategy(new MiniProgramStrategy()); context.executeBuyTicket(); } }现在我们要加一个「自助机」买票只需要再新增一个「自助机策略类」就可以了。当我们以后遇到同一个行为动作会有不同的实现方式并且算法之间不会自动流转切换这句话很重要。就可以考虑策略模式了。所以策略模式是一种行为型设计模式。但是设计模式有一个缺点其中一个客户端必须知道所有策略类才能挑选合适的策略。用白话一点的语言解释就是客户端需要new 对应的策略类。那种该怎么解决呢我们需要结合另外一种设计模式——静态工厂模式。静态工厂模式这种设计模式非常简单用一句话概括由一个工厂类根据传入的参数动态决定创建哪一个产品类的实例。注意静态工厂不算是GoF23种设计模式之一。就是用的场景比较多了。角色分析抽象产品静态工厂返回的抽象类型。具体产品抽象产品的具体实现类。工厂类一个静态方法方法中带有参数根据参数new 不同的具体产品返回抽象产品类型。上面的买票策略我们可以使用静态工厂创建不同的策略类。// 抽象产品 public interface Shape { void draw(); } // 具体产品1圆形 public class Circle implements Shape{ Override public void draw() { System.out.println(绘制圆形); } } // 具体产品2矩形 public class Rectangle implements Shape{ Override public void draw() { System.out.println(绘制矩形); } } // 工厂类静态方法根据参数创建实例【静态工厂核心】 public class ShapeFactory { // 静态创建方法 public static Shape getShape(String type){ if(circle.equals(type)){ return new Circle(); }else if(rectangle.equals(type)){ return new Rectangle(); } return null; } } public class Client { public static void main(String[] args) { Shape s1 ShapeFactory.getShape(circle); s1.draw(); Shape s2 ShapeFactory.getShape(rectangle); s2.draw(); } }我们将买票策略和静态工厂模式结合起来部分代码改变如下// 新增一个工厂类 public class StrategyFactory { public static Strategy getStrategy(String code){ if(code.equals(tickWindow)){ return new TicketWindowStrategy(); } if(code.equals(minProgramStrategy)){ return new MiniProgramStrategy(); } if(code.equals(appStrategy)){ return new AppStrategy(); } throw new IllegalArgumentException(参数无效); } } // 客户端改动 public static void main(String[] args) { Strategy ticketWindowStrategy StrategyFactory.getStrategy(ticketWindow); Context context new Context(ticketWindowStrategy); context.executeBuyTicket(); // 动态切换策略 context.setStrategy(StrategyFactory.getStrategy(miniProgramStrategy)); context.executeBuyTicket(); }
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/29 3:32:44
用 Claude Code 给初中生做九个物理模拟器:单文件合并的坑与解法(TaoToken 配置避坑版)
2026/9/29 3:32:44
大数据影视可视化系统从0到1:Flask+ECharts+MySQL全流程落地
2026/9/29 3:32:44
Vue WebRTC 实时音视频直播实战:低延迟、信令与响应式避坑
2026/9/29 6:58:03
从零搭建AI工程能力:数据、模型、训练与推理全链路实践
2026/9/29 6:58:03
Hindsight:面向LLM应用的轻量级API可观测性工具
2026/9/29 6:58:03
SciDavis完全指南:Mac上免费替代Origin的科研绘图工具
2026/9/29 6:58:03
嵌入式开发实战:从RECH作业到工程化项目完整复盘
2026/9/29 6:58:03
Midway 移除 Node.js v14 CI:从 v3.12.0 起的版本策略、兼容性保障与工程实践
2026/9/29 6:53:03
前端 VSCode 常用插件、快捷键与技巧:用 TaoToken 统一 Key 打通 AI 编码链路
2026/9/29 0:02:32
开源模型端侧落地实战:量化、推理加速与Agent上下文管理
2026/9/29 0:02:32
AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成
2026/9/29 0:02:32
Java采购管理系统实战:从数据库设计到事务一致性
2026/9/28 2:37:38
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
2026/9/28 5:00:42
新手入门看这篇:建设网站加盟避坑指南与SEO实操
2026/9/28 8:17:28
论文AIGC疑似度是什么意思?想查论文AI率有哪些免费工具?