# 设计模式 **Repository Path**: saodi99/design-pattern ## Basic Information - **Project Name**: 设计模式 - **Description**: 设计模式的一些简单demo 组合使用设计模式 部分代码内容使用AI生成 内容仅供参考 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-17 - **Last Updated**: 2025-09-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, 设计模式 ## README # Java设计模式示例项目 本项目是一个Java设计模式学习和演示项目,展示了GoF提出的23种常见设计模式的实现和应用。通过具体的代码示例帮助理解各种设计模式的用途和实现方式。 ## 项目结构 ``` src/main/java/com/saodi/ ├── abstractfactory/ # 抽象工厂模式 ├── adapter/ # 适配器模式 ├── bridge/ # 桥接模式 ├── builder/ # 建造者模式 ├── commond/ # 命令模式 ├── composite/ # 组合模式 ├── decorator/ # 装饰器模式 ├── facade/ # 外观模式 ├── factory/ # 工厂方法模式 ├── flyweight/ # 享元模式 ├── interpreter/ # 解释器模式 ├── iterator/ # 迭代器模式 ├── mediator/ # 中介者模式 ├── memento/ # 备忘录模式 ├── observer/ # 观察者模式 ├── pattern/ # 责任链模式 ├── prototype/ # 原型模式 ├── proxy/ # 代理模式 ├── singleton/ # 单例模式 ├── state/ # 状态模式 ├── stateAndStrategy/ # 状态与策略模式组合 ├── strategy/ # 策略模式 ├── strategyAndPattern/# 策略模式扩展应用 ├── template/ # 模板方法模式 └── visitor/ # 访问者模式 ``` ## 设计模式完整列表 ### 创建型模式 (Creational Patterns) #### 1. 工厂方法模式 (Factory Method Pattern) 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 - 应用场景:创建对象时隐藏创建逻辑,将具体类的实例化推迟到子类 #### 2. 抽象工厂模式 (Abstract Factory Pattern) 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 - 应用场景:系统要独立于产品的创建、组合和表示时 #### 3. 单例模式 (Singleton Pattern) 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 - 应用场景:配置管理器、日志管理器、数据库连接池等 #### 4. 建造者模式 (Builder Pattern) 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - 应用场景:创建复杂对象,对象内部组件的构造顺序稳定但组件本身可能变化 #### 5. 原型模式 (Prototype Pattern) 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 - 应用场景:对象创建成本较高,需要避免重复初始化 ### 结构型模式 (Structural Patterns) #### 6. 适配器模式 (Adapter Pattern) 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 - 应用场景:集成第三方库、系统重构兼容旧接口 #### 7. 桥接模式 (Bridge Pattern) 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 - 应用场景:不希望在抽象和它的实现部分之间有一个固定的绑定关系 #### 8. 组合模式 (Composite Pattern) 将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 - 应用场景:树形菜单、文件夹和文件的管理 #### 9. 装饰器模式 (Decorator Pattern) 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。 - 应用场景:Java I/O流、Web开发中的过滤器 #### 10. 外观模式 (Facade Pattern) 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 - 应用场景:简化复杂系统的使用接口 #### 11. 享元模式 (Flyweight Pattern) 运用共享技术有效地支持大量细粒度的对象。 - 应用场景:系统中存在大量相似对象,需要缓冲池的场景 #### 12. 代理模式 (Proxy Pattern) 为其他对象提供一种代理以控制对这个对象的访问。 - 应用场景:远程代理、虚拟代理、安全代理 ### 行为型模式 (Behavioral Patterns) #### 13. 责任链模式 (Chain of Responsibility Pattern) 为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 - 应用场景:日志处理、异常处理、审批流程 #### 14. 命令模式 (Command Pattern) 将请求封装成对象,从而使您可以用不同的请求对客户进行参数化。 - 应用场景:遥控器、菜单项、按钮等GUI组件 #### 15. 解释器模式 (Interpreter Pattern) 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 - 应用场景:规则引擎、表达式计算 #### 16. 迭代器模式 (Iterator Pattern) 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。 - 应用场景:集合遍历 #### 17. 中介者模式 (Mediator Pattern) 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 - 应用场景:聊天室、MVC框架中的控制器 #### 18. 备忘录模式 (Memento Pattern) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 - 应用场景:撤销操作、快照功能 #### 19. 观察者模式 (Observer Pattern) 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - 应用场景:事件处理系统、发布-订阅系统 #### 20. 状态模式 (State Pattern) 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 - 应用场景:订单状态、游戏角色状态 #### 21. 策略模式 (Strategy Pattern) 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。 - 应用场景:支付方式选择、排序算法 #### 22. 模板方法模式 (Template Method Pattern) 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 - 应用场景:框架设计、算法骨架 #### 23. 访问者模式 (Visitor Pattern) 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 - 应用场景:编译器设计、报表生成 ## 使用建议 ### 学习顺序建议 1. 模板方法模式 2. 策略模式 3. 命令模式 4. 状态模式 5. 责任链模式 6. 迭代器模式 7. 解释器模式 8. 观察者模式 9. 单例模式 10. 工厂方法模式 11. 抽象工厂模式 12. 建造者模式 13. 原型模式 14. 适配器模式 15. 装饰器模式 16. 外观模式 17. 享元模式 18. 代理模式 19. 桥接模式 20. 组合模式 21. 中介者模式 22. 备忘录模式 23. 访问者模式 ### 实践建议 - 每个设计模式都有其适用场景,不要为了使用模式而使用模式 - 理解模式的意图比记住代码结构更重要 - 在实际项目中根据具体需求选择合适的设计模式 - 组合使用多种设计模式可以解决复杂问题 ## 运行环境 - Java 8+ - Maven 3.6+ ## 依赖说明 - Velocity: 模板引擎 - SLF4J + Logback: 日志框架 - Lombok: 简化Java代码 ## 如何运行示例 每个设计模式包中都包含一个示例演示类(以PatternExample命名),可以直接运行查看效果。 例如: - 运行模板方法模式示例: `com.saodi.template.TemplateMethodExample` - 运行策略模式示例: `com.saodi.strategy.StrategyPatternExample` - 运行观察者模式示例: `com.saodi.observer.ObserverPatternExample` 责任链模式: 多个对象都有可能处理请求,但由运行时链式结构决定谁处理 策略模式: 一个请求有多种处理方式,但客户端需要明确知道并选择使用哪一种 支付选择特定的支付账户 当选择账户不足以支付的时候 可以走 用户规定支付优先级 来形成任务链 跟支付宝支付有些像似 状态模式与策略模式在结构上非常相似,但意图不同。策略模式是让客户端选择一种算法,而状态模式是对象内部状态改变时自动改变行为。 组合使用状态模式和策略模式的一个典型场景是:我们有一个对象,它有不同的状态,每个状态下可以有不同的策略(行为)。 例如,考虑一个游戏中的角色,它有不同的状态(正常、受伤、死亡),每个状态下移动策略不同(正常移动、缓慢移动、不能移动)。 同时,我们可能还想在同一个状态下有不同的移动策略(比如正常状态下可以选择走路、跑步等策略)。 设计思路: 使用状态模式来管理角色的状态(正常、受伤、死亡)。 在每个状态中,使用策略模式来设置不同的移动策略。 但是注意:状态模式中的状态对象通常知道其他状态,并且可以触发状态转换;而策略模式中的策略对象通常不关心其他策略。 下面我们实现一个游戏角色的例子: 角色(Context)有状态(State),每个状态中有一个移动策略(MoveStrategy)。状态可以转换,移动策略也可以动态改变。 步骤: 定义移动策略接口和具体策略。 定义状态接口和具体状态。状态接口中有一个移动方法,该方法使用移动策略。 定义角色类,它有一个当前状态,并且可以设置状态和移动策略。 注意:在这个组合中,状态对象可能会持有角色对象的引用,以便在适当的时候转换状态 ## 1、模板方法模式 (Template Method) 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 (如:HttpServlet 的 doGet(), doPost() 方法)