设计模式是软件开发中针对反复出现的问题所总结的通用解决方案。根据《设计模式:可复用面向对象软件的基础》(四人帮著作),设计模式主要分为三大类:创建型、结构型和行为型。以下是最常用的设计模式及其核心概念:
一、创建型模式(Creational Patterns)
关注点:对象的创建机制,解耦对象的创建和使用。
- 单例模式(Singleton)
- 意图:确保一个类只有一个实例,并提供全局访问点。
- 应用:配置管理器、日志记录器、数据库连接池。
- 工厂模式(Factory Method)
- 意图:定义创建对象的接口,让子类决定实例化哪个类。
- 应用:根据条件创建不同类型的对象(如形状工厂、数据库连接工厂)。
- 抽象工厂模式(Abstract Factory)
- 意图:提供一个创建一系列相关或依赖对象的接口,无需指定具体类。
- 应用:创建跨平台的UI组件(如Windows/Linux的按钮、文本框)。
- 建造者模式(Builder)
- 意图:将复杂对象的构建与表示分离,允许相同构建过程创建不同表示。
- 应用:构建复杂对象(如汽车、HTML文档)。
- 原型模式(Prototype)
- 意图:通过复制现有对象来创建新对象,无需知道创建细节。
- 应用:对象初始化成本高或需要避免构造函数的约束。
二、结构型模式(Structural Patterns)
关注点:如何将类或对象组合成更大的结构。
- 代理模式(Proxy)
- 意图:通过代理对象控制对原对象的访问。
- 应用:远程代理(如RMI)、虚拟代理(延迟加载)、保护代理(权限控制)。
- 装饰器模式(Decorator)
- 意图:动态地给对象添加额外职责,替代继承。
- 应用:Java I/O流(如
BufferedInputStream
包装FileInputStream
)。
- 适配器模式(Adapter)
- 意图:将一个类的接口转换成客户期望的另一个接口。
- 应用:兼容旧系统接口、第三方库适配。
- 桥接模式(Bridge)
- 意图:将抽象部分与实现部分分离,使它们可以独立变化。
- 应用:跨平台图形绘制、JDBC驱动。
- 组合模式(Composite)
- 意图:将对象组合成树形结构以表示“部分-整体”的层次关系。
- 应用:文件系统、组织架构图。
- 外观模式(Facade)
- 意图:为复杂子系统提供统一的高层接口,简化客户端使用。
- 应用:封装第三方API、Spring MVC的
DispatcherServlet
。
- 享元模式(Flyweight)
- 意图:通过共享技术有效支持大量细粒度对象。
- 应用:文本编辑器中的字符对象、游戏中的粒子系统。
三、行为型模式(Behavioral Patterns)
关注点:对象之间的交互和职责分配。
- 观察者模式(Observer)
- 意图:定义对象间的一对多依赖,当一个对象状态改变时,所有依赖者都会收到通知。
- 应用:事件监听(如GUI事件)、消息队列。
- 策略模式(Strategy)
- 意图:定义一系列算法,将每个算法封装起来,并使它们可以互换。
- 应用:排序算法切换、支付方式选择。
- 状态模式(State)
- 意图:允许对象在内部状态改变时改变其行为,看起来像是修改了类。
- 应用:工作流引擎、游戏角色状态切换。
- 责任链模式(Chain of Responsibility)
- 意图:将请求的发送者和接收者解耦,使多个对象都有机会处理请求。
- 应用:Servlet过滤器链、异常处理链。
- 命令模式(Command)
- 意图:将请求封装为对象,使请求的发送者和接收者解耦,并支持请求的排队、记录和撤销。
- 应用:GUI按钮点击处理、数据库事务。
- 模板方法模式(Template Method)
- 意图:定义算法的骨架,将一些步骤延迟到子类实现。
- 应用:HttpServlet的
doGet()
/doPost()
方法、JUnit测试框架。
- 迭代器模式(Iterator)
- 意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
- 应用:Java集合框架中的
Iterator
接口。
- 访问者模式(Visitor)
- 意图:将算法与对象结构分离,允许在不改变对象结构的前提下定义作用于这些对象的新操作。
- 应用:编译器的语法树遍历、XML解析器。
- 中介者模式(Mediator)
- 意图:定义一个中介对象来封装一系列对象之间的交互,使各对象不需要显式地相互引用。
- 应用:聊天室、MVC架构中的Controller。
- 备忘录模式(Memento)
- 意图:在不破坏封装性的前提下,捕获并外部化对象的内部状态,以便对象可以恢复到该状态。
- 应用:游戏存档、文本编辑器的撤销功能。
- 解释器模式(Interpreter)
- 意图:给定一个语言,定义它的文法表示,并定义一个解释器来解释该文法。
- 应用:正则表达式解析、SQL查询解释。
四、其他常见模式
- MVC模式(Model-View-Controller)
- 意图:将应用分为模型(数据)、视图(展示)和控制器(逻辑)三部分,解耦交互。
- 应用:Web框架(如Spring MVC、Struts)、桌面应用。
- 委派模式(Delegate)
- 意图:不亲自处理任务,而是委派给其他对象处理。
- 应用:Spring的
DispatcherServlet
、JUnit的测试执行。
- 空对象模式(Null Object)
- 意图:用空对象替代空引用,避免空指针异常。
- 应用:
Collections.emptyList()
、日志框架的空实现。
- 门面模式(Facade)
- 意图:为子系统中的一组接口提供统一的高层接口,简化客户端使用。
- 应用:封装第三方API、企业服务层。
设计模式的核心原则
- 开闭原则(Open/Closed Principle):对扩展开放,对修改关闭。
- 依赖倒置原则(Dependency Inversion):依赖抽象而非具体实现。
- 单一职责原则(Single Responsibility Principle):一个类只负责一个功能领域。
- 接口隔离原则(Interface Segregation Principle):客户端不应该依赖它不需要的接口。
- 里氏替换原则(Liskov Substitution Principle):子类可以替换父类而不影响程序正确性。
- 迪米特法则(Law of Demeter):一个对象应该对其他对象有最少的了解。
总结
设计模式是经验的总结,而非教条。使用时需结合具体场景,避免过度设计。建议通过阅读经典书籍(如《设计模式》《Effective Java》)和分析开源项目(如Spring、Hibernate)深入学习。