Java设计模式概述

一、设计模式概述

设计模式为开发人员提供了一系列经过验证的解决方案,能够显著提升代码的可读性和可维护性。这些模式广泛应用于开源基础框架中,如JDK、Spring等,如果你不熟悉设计模式想要理解这些框架的源代码就会非常困难。

在业务项目中,设计模式的应用会受到一些限制。特别是以业务为导向的技术团队中,成员的技术背景可能存在差异,如果设计模式应用得不恰当,可能会导致后续维护过程成为一场灾难。

注:理解设计模式的定义,才能在实践中更恰当地使用它,本文主要介绍设计模式定义和应用场景,让大家有一个整体印象,后续章节会重点介绍一些常用的设计模式在业务系统中的应用。

二、Java常见设计模式简单介绍

1、创建型

创建型模式关注对象的【创建】过程,使对象的创建和使用分离,在使用对象时无需关心对象的创建细节。

1、单例模式

定义:确保一个类只有一个实例,并且提供一个全局访问点来访问这个唯一实例。

典型应用场景:数据库连接池、线程池、应用的配置信息管理。

JDK中例子:java.lang.Runtimejava.awt.Desktop 

2、简单工厂模式

定义:  创建一个工厂类,它可以根据参数不同返回不同实例,被创建的实例通常都有共同的父类。

典型应用场景:日志记录器(支持文件、数据库、控制台等多种输出方式)、文件解析器(解析XML、JSON、CSV多种文件)、支付方式选择(电商平台用户选择不同的支付方式:微信、支付宝、银行卡,可以创建不同的支付处理类)。

JDK中例子:java.util.Calendar 、java.text.NumberFormat  根据不同的地区或国家返回不同的日历和NumberFormat 实例。

3、工厂方法模式

定义:定义一个创建对象的接口,将具体对象的创建交给子类实现,以实现对象的创建与使用解耦。

典型应用场景:数据库访问(不同数据库)、日志记录器、多语言支持(创建不同语言本地化资源管理器)。

JDK中例子:java.util.Collection的iterator()是一个典型的工厂方法,不同集合类ArrayList、LinkedList、HashSet都实现了Collection接口,并返回了适合自己的迭代器对象。

4、抽象工厂模式

定义:提供了一组相关对象创建的接口,使得可以通过切换工厂类创建不同系列对象,而无需修改客户端

典型应用场景:多样化界面主题、产品系列(如不同型号的汽车、家电等)、数据库访问层(每个工厂定义适合该数据库的访问对象)

JDK中例子:javax.swing.UIManager 

5、建造者模式模式

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

典型应用场景:复杂对象的构建,保持对象的不可变性

JDK中例子:java.lang.StringBuilder、java.lang.StringBuffer。

6、原型模式

定义:通过克隆已有的对象来创建新对象,避免重复的初始化过程,实现对象复制与创建解耦

典型应用场景:对象创建代价高、避免重复创建。

JDK中例子:java.lang.Object中clone方法,java.util.ArrayList(ArrayList) .

2、结构型

结构型模式关注类和对象【组织】在一起,简化不同对象之间的交互和依赖。

1、适配器模式

定义:将一个接口转换为客户希望的另一个接口,使得接口不兼容的那些类可以一起工作

应用场景:现有接口与新接口不匹配、旧代码复用、集成第三方库。

JDK中例子:java.util.Collections的enumeration方法将新的遍历接口Iterator适配成老的enumeration接口。

2、桥接模式

定义:将抽象部份与实现部份分离,使它们都可以独立的变化,通过创建一个连接(桥接)来关联抽象部份和实现部份。

应用场景:抽象与实现分离、多维度变化。

JDK中例子:AWT中使用桥接模式来实现组件(如按纽、标签、面板)和其外观之间的分离。

3、组合模式

定义:组合多个对象形成树形结构以表示具有 “整体-部份” 关系的层次结构。

应用场景:树形结构、部份-整体关系、层次操作、递归处理。

JDK中例子:java.util.ArrayList实现了List接口,而List接口又扩展了Collection接口,形成树状结构

4、装饰模式

定义:动态地给一个对象增加额外的职责。

典型应用场景:图形界面组件库(用装饰模式动态添加不同样式)、I/O流处理 (用装饰模式实现各种功能的组合,如给输入流添加缓冲、解密、压缩功能)、餐厅订单系统(点菜加调料)。

JDK中例子:InputStream的子类FileInputStream、BufferedInputStream都是使用装饰模式对字节流的增强处理。

5、外观模式

定义:外部与一个子系统通信都通过一个统一的外观对象进行,为子系统中一组接口提供统一的入口。

典型应用场景:多媒体播放器,订单处理系统。

JDK中例子:java.swing.JOptionPane

6、享元模式

定义:运用共享技术支持大量细粒度对象的复用。

典型应用场景:游戏中的角色和道具(相同类型角色外部状态如状态位置不同,但内部状态如技能相同),操作系统中的线程(多个线程共享同一代码段,但拥有各息的状态)。

JDK中例子:String Pool  字符串常量池。

7、代理模式

定义:给某一个对象提供一个代理或占位符,并由代理对象控制原对象的引用。

典型应用场景:图片加载虚拟代理(先显示占位图,在需要时显示高分辨率实际图片)、远程服务代理。

JDK中例子:RMI

3、行为型

行为型模式关注类和对象【交互】和协作。

1、职责链模式

定义:避免将请求发送者和接收者耦合在一起,让多个对象都有机会接收请求,将这些对象链接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

典型应用场景:审批流程、用户输入处理。

JDK中例子:Servlet过滤器链

2、命令模式

定义:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或记录请求日志以及支持可撤消的操作。

典型应用场景:遥控器设备、任务调度。

JDK中例子:java Swing事件处理机制。

3、解析器模式

定义:定义一个语言的文法,并建立一个解析器来解析该语言中的句子。

典型应用场景:表达式解析、配置文件解析

JDK中例子:java.util.regex

4、迭代器模式

定义:提供一个方法来顺序访问聚合对象中各个元素,而不用暴露这个对象的内部表示。

典型应用场景:遍历集合

JDK中例子:ArrayList、LinkedList都实现了java.util.Iterator用于遍历集合中的元素。

5、中介者模式

定义:用一个中介对象来封装一系列的对象交互,中介使用者不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

典型应用场景:聊天系统(用户之间消息交互通过中介者协调)、游戏协调(玩家之间通过中介者协调)

6、备忘录模式

定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到以前保存的状态。

典型应用场景:文本编辑器的撤消功能、操作日志记录。

7、观察者模式

定义:定义对象之间一对多之间的依赖关系,使得每当一个对象状态发生改变时,其相关依赖皆得到通知并被自动更新。

典型应用场景:GUI事件处理、发布-订阅模式

JDK中例子:awt、swing中事件处理机制。

8、状态模式

定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

典型应用场景:订单状态管理(待付款、已付款、已发货、已完成每个状态对应不同行为)、游戏状态角色。

JDK中例子:线程状态。

9、策略模式

定义:定义一系列算法类,将每一个算法封装起来并让他们可以相互替换,使得算法的变化可以独立它的客户。

典型应用场景:支付方式选择(支付宝、微信、信用卡)、日志记录级别。

10、模板模式

定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可定义算法的某些特定步骤。

典型应用场景:网络框架开发(用模板定义通信处理流程,如建立连接、发送数据、接收数据,不同协议由不同的子类实现)、数据库访问(用模板定义数据库访问流程,如建立连接、执行查询、处理结果,不同的数据库由不同的子类处理)。

11、访问者模式

定义:提供一个作用于某对象结构中各元素的操作表示,使得在可以不改变各元素的类的前提下定义这些元素的新操作。

典型应用场景:文件系统遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值