广东省建设工程执业资格注册中心网站,手机软件定制开发公司,百度网站评级,专业自适应网站建设极速建站一、Java 核心1. 基础语法final关键字的作用修饰类#xff1a;类不可被继承#xff08;如String类#xff09;#xff0c;保证类的稳定性和安全性。修饰方法#xff1a;方法不可被重写#xff08;防止子类篡改父类核心逻辑#xff0c;如工具类方法#xff09;。修饰变量…一、Java 核心1. 基础语法final关键字的作用修饰类类不可被继承如String类保证类的稳定性和安全性。修饰方法方法不可被重写防止子类篡改父类核心逻辑如工具类方法。修饰变量基本类型值不可修改如final int a  10a的值终身不变。引用类型引用地址不可变对象内容可修改如final ListString list  new ArrayList()list可添加元素但不能指向新集合。深拷贝 vs 浅拷贝类型特点实现方式适用场景浅拷贝仅复制对象本身及基本类型字段引用类型字段与原对象共享同一份引用新旧对象关联Object.clone()默认实现需实现Cloneable接口、BeanUtils.copyProperties()简单对象复制无需完全隔离引用关系深拷贝递归复制所有字段包括引用类型新旧对象完全独立无任何关联手动递归复制、序列化Serializable、JSON 工具如 Jackson复杂对象复制需彻底隔离引用关系2. 集合框架HashMap底层结构Java 8采用数组  链表  红黑树混合结构平衡查询效率与内存开销数组桶初始容量为 16DEFAULT_INITIAL_CAPACITY扩容时按 2 倍增长newCap  oldCap  1存储链表头节点或红黑树根节点。链表哈希冲突时不同 key 计算出相同索引用链表存储元素查询时间复杂度为 O (n)。红黑树当链表长度超过 8TREEIFY_THRESHOLD且数组长度≥64MIN_TREEIFY_CAPACITY时链表转为红黑树查询时间复杂度优化为 O (log n)当长度≤6UNTREEIFY_THRESHOLD时红黑树转回链表降低树结构维护成本。优化点哈希计算(key  null) ? 0 : (h  key.hashCode()) ^ (h  16)通过高位与低位异或减少哈希冲突将高位信息融入低位。扩容机制使用高位掩码计算新索引newIndex  oldCap  (index  (oldCap - 1))避免节点重新哈希直接定位新位置。HashMap线程安全性HashMap非线程安全多线程并发操作可能导致数据覆盖多线程同时put时可能覆盖彼此的结果。Java 7 死循环链表采用头插法扩容时可能导致链表成环Java 8 改为尾插法解决但仍非线程安全。线程安全的 Map 实现ConcurrentHashMap推荐Java 7基于分段锁Segment每个 Segment 是独立的哈希表并发度为 Segment 数量默认 16。Java 8移除 Segment改用 CAS  synchronized只锁单个桶并发效率更高支持computeIfAbsent等原子操作。Hashtable全表锁所有方法用synchronized修饰并发性能差已淘汰。Collections.synchronizedMap(Map)包装普通 Map通过同步代码块synchronized (mutex)保证安全性能一般锁整个 Map。ArrayList vs LinkedList特性ArrayListLinkedList底层结构动态数组连续内存空间双向链表非连续内存随机访问O (1)通过索引直接访问O (n)需遍历链表插入 / 删除中间操作 O (n)需移动元素尾部操作 O (1)中间操作 O (1)修改指针但定位节点需 O (n)内存占用较少连续空间有扩容冗余较多每个节点含前后指针扩容机制容量不足时扩容为 1.5 倍oldCap  (oldCap  1)无扩容动态添加节点适用场景频繁查询、尾部增删频繁中间插入 / 删除3. JVM内存区域划分区域类型包含区域特点可能的异常线程私有虚拟机栈存储栈帧局部变量表、操作数栈、返回地址等方法调用时创建结束时销毁。栈深度超过限制→StackOverflowError内存不足→OutOfMemoryError。本地方法栈为native方法如Object.hashCode()提供内存空间。同虚拟机栈。程序计数器记录当前线程执行的字节码行号如分支、循环、跳转。唯一不会抛出 OOM 的区域。线程共享堆存储对象实例、数组GC 主要工作区域分新生代、老年代。内存不足→OutOfMemoryError。方法区元空间存储类信息结构、方法数据、常量池、静态变量、JIT 编译后的代码。JDK 8 前永久代可能 OOMJDK 8 后元空间使用本地内存默认无上限可通过-XX:MaxMetaspaceSize限制。垃圾回收GC判定机制采用可达性分析算法GC Roots根对象虚拟机栈中局部变量表引用的对象如方法内的User user  new User()。方法区中类静态变量引用的对象如static User user  new User()。方法区中常量引用的对象如String s  abc中的abc。本地方法栈中native方法引用的对象。判定流程从 GC Roots 出发遍历所有可达对象并标记未被标记的对象为不可达对象可被回收但并非立即回收需经历多次标记。引用类型对回收的影响强引用User u  new User()永不回收OOM 也不释放。软引用SoftReferenceUser内存不足时回收用于缓存如图片缓存。弱引用WeakReferenceUserGC 时立即回收用于临时关联如ThreadLocal的 key。虚引用PhantomReferenceUser仅用于跟踪对象回收必须配合引用队列无实际引用意义如堆外内存回收。类加载机制遵循双亲委派模型防止类重复加载流程加载Loading通过类全限定名如com.xxx.User读取.class文件到内存生成Class对象存方法区。验证Verification检查字节码合法性格式、语义、字节码指令、符号引用防止恶意 class 文件。准备Preparation为静态变量static分配内存并赋默认值如static int a  10此处赋 0。解析Resolution将符号引用如类名、方法名转为直接引用内存地址。初始化Initialization执行clinit()方法合并静态变量赋值与静态代码块按顺序执行。使用Using实例化对象、调用方法。卸载Unloading类不再被引用且类加载器被回收时Class对象被卸载极少发生。垃圾回收机制分代收集理论新生代Young Generation对象存活时间短如方法内临时变量约 90% 对象会被回收频繁触发Minor GC年轻代 GC。结构Eden 区80%  From Survivor 区10%  To Survivor 区10%。算法复制算法将 Eden 和 From Survivor 存活对象复制到 To Survivor清空原区域无碎片。老年代Old Generation对象存活时间长如缓存对象触发Full GC全局 GC频率低。算法标记 - 清除标记存活对象清除未标记对象可能产生碎片或标记 - 整理标记后将存活对象压缩到一端消除碎片。GC 算法实现Serial GC单线程回收STWStop The World时间长适合客户端应用如桌面程序。Parallel GC多线程回收以吞吐量用户线程运行时间 / 总时间为目标JDK 8 默认年轻代收集器。CMS GCConcurrent Mark Sweep低延迟优先步骤初始标记STW→并发标记→重新标记STW→并发清除仅初始和重新标记 STW缺点内存碎片多、CPU 消耗高JDK 9 后废弃。G1 GCGarbage-First区域化分代式收集器取代 CMS将堆分为多个 Region兼顾吞吐量和延迟JDK 9  默认适合大堆场景如 8G 以上。JVM 调优经验核心参数bash
-Xms2g -Xmx2g  # 堆初始和最大大小设为相同避免动态扩容
-XX:NewRatio2  # 老年代:新生代2:1默认
-XX:SurvivorRatio8  # Eden:From:To8:1:1
-XX:MaxMetaspaceSize256m  # 元空间上限默认无上限
-XX:UseG1GC  # 使用G1垃圾回收器
-XX:MaxGCPauseMillis200  # G1目标最大STW时间毫秒
-XX:HeapDumpOnOutOfMemoryError  # OOM时生成堆转储文件
-XX:HeapDumpPath/path/to/dump  # 堆转储文件路径
调优场景Full GC频繁检查是否有大对象频繁进入老年代如大集合未释放增大老年代内存-Xmx或调整晋升阈值-XX:MaxTenuringThreshold默认 15。OOMJava heap space通过jmap -heap pid分析堆使用结合堆转储文件jhat或 MAT 工具定位内存泄漏如静态集合未清理。延迟过高切换至 G1 或 ZGC超低延迟调小-XX:MaxGCPauseMillis。4. 多线程线程安全集合ConcurrentHashMap线程安全的哈希表见上文。CopyOnWriteArrayList读写分离写时复制新数组add/set时读无需锁适合读多写少场景如配置列表。ConcurrentLinkedQueue无锁并发队列基于 CAS 实现高效生产者 - 消费者模型。BlockingQueue阻塞队列ArrayBlockingQueue、LinkedBlockingQueue支持put满时阻塞和take空时阻塞适合异步通信。线程池核心参数ThreadPoolExecutorjava
new ThreadPoolExecutor(corePoolSize,    // 核心线程数长期存活即使空闲maximumPoolSize, // 最大线程数核心  临时线程keepAliveTime,   // 临时线程空闲存活时间unit,            // 时间单位如TimeUnit.SECONDSworkQueue,       // 工作队列存放等待执行的任务threadFactory,   // 线程工厂自定义线程名、优先级等handler          // 拒绝策略队列满且线程达最大时触发
)
参数设置策略核心线程数corePoolSizeCPU 密集型任务如计算CPU核心数  1减少线程切换充分利用 CPU。IO 密集型任务如网络请求、文件读写CPU核心数 * 2线程多处于等待状态需更多线程提高吞吐量。最大线程数maximumPoolSize通常为核心线程数的 2 倍需结合队列容量队列满时才创建临时线程。工作队列LinkedBlockingQueue无界队列默认容量 Integer.MAX_VALUE适合高吞吐但需控制内存避免 OOM。ArrayBlockingQueue有界队列适合资源有限场景需合理设置容量避免队列过大导致内存溢出。SynchronousQueue无缓冲队列直接移交任务给线程适合快速响应场景配合maximumPoolSize为 Integer.MAX_VALUE。拒绝策略AbortPolicy抛RejectedExecutionException默认。CallerRunsPolicy由提交任务的线程执行减缓提交速度自带限流。DiscardPolicy默默丢弃新任务。DiscardOldestPolicy丢弃队列中最旧的任务尝试提交新任务。使用示例java
// 构建线程池
ExecutorService executor  new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS,new LinkedBlockingQueue(100),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy()
);
// 提交任务
executor.submit(() - System.out.println(Task running)); // 返回Future
// 关闭线程池
executor.shutdown(); // 执行完现有任务后关闭不再接受新任务
synchronized锁升级synchronized通过锁升级机制优化性能从低效到高效无锁状态对象刚创建无线程竞争Mark Word 存储对象哈希码。偏向锁同一线程多次获取锁Mark Word 记录线程 ID避免 CAS 操作适用于单线程场景。轻量级锁多线程交替获取锁通过 CAS 竞争锁自旋尝试避免重量级锁开销适用于短时间竞争。重量级锁多线程并发竞争激烈自旋失败后膨胀为重量级锁依赖操作系统互斥量线程阻塞等待适用于长时间竞争。二、MySQL 数据库1. 索引底层结构InnoDB采用B  树原因磁盘友好非叶子节点仅存索引键叶子节点存储数据聚集索引或主键二级索引单节点存储更多键减少 I/O 次数。范围查询高效叶子节点通过双向链表连接支持快速范围扫描如WHERE id  100 AND id  200。平衡性好B  树为平衡树查询时间稳定在 O (log n)。对比 B 树B 树叶子节点和非叶子节点都存数据单节点存储键数少树高更高I/O 效率低。索引类型聚集索引主键索引按主键排序叶子节点存储完整数据行InnoDB 表必存在无主键则选唯一索引否则隐式生成 6 字节 ROWID。二级索引非主键索引按索引列排序叶子节点存储主键值查询时需通过主键回表到聚集索引查完整数据。联合索引多列组合索引如(a,b,c)遵循最左前缀原则查询条件含a或ab或abc时生效。索引失效场景未遵循最左前缀原则如联合索引(a,b,c)查询WHERE b1则失效。对索引列进行计算 / 函数操作如WHERE YEAR(create_time)  2023create_time索引失效。使用!、、NOT IN优化器可能放弃索引选择全表扫描。隐式类型转换如varchar列用数字查询WHERE name  123索引失效。OR条件中存在非索引列如WHERE a1 OR b2仅a有索引则失效。LIKE以通配符开头如WHERE name LIKE %张无法使用索引。数据量极小优化器认为全表扫描比走索引更快。IS NULL/IS NOT NULL取决于字段是否允许为 NULL 及数据分布。索引设计原则适合建索引高频查询条件WHERE、排序 / 分组字段ORDER BY/GROUP BY、联合索引需满足最左前缀。不适合建索引低区分度字段如性别、状态基数低、频繁更新字段索引维护成本高、表数据量极少全表扫描更快。2. 事务ACID 特性原子性Atomicity事务要么全执行要么全回滚。由Undo Log实现记录数据修改前状态回滚时恢复。一致性Consistency事务执行前后数据状态合法如转账后总金额不变。由原子性、隔离性、持久性共同保证。隔离性Isolation多事务并发时操作互不干扰。由锁行锁、间隙锁和 MVCC多版本并发控制实现。持久性Durability事务提交后数据永久保存。由Redo Log实现先写日志再刷盘崩溃后重放日志恢复。隔离级别隔离级别脏读读未提交数据不可重复读重读数据变幻读新增数据被读到实现方式读未提交RU存在存在存在无锁直接读取最新数据读已提交RC不存在存在存在MVCC快照读每次读新快照可重复读RR不存在不存在不存在InnoDBMVCC  间隙锁防止新增数据串行化Serial不存在不存在不存在全表锁事务按顺序执行幻读解决InnoDB 在 RR 级别通过间隙锁锁定索引范围如WHERE id  10会锁定 10 以上的间隙防止其他事务插入新行避免幻读。显式加锁SELECT ... FOR UPDATE也可解决。3. 日志日志类型作用特点Binlog二进制日志记录所有写操作DDL、DML用于主从复制从库同步主库日志和数据恢复mysqlbinlog回放。逻辑日志记录 SQL 语句或行变更追加写入可通过expire_logs_days自动清理。Redo Log重做日志InnoDB 引擎日志记录数据页修改保证事务持久性崩溃后重放日志恢复数据。物理日志记录页地址和修改内容循环写入固定大小有innodb_log_file_size控制大小。Undo Log回滚日志InnoDB 引擎日志记录数据修改前状态用于事务回滚和 MVCC提供历史版本。事务提交后可删除存储在 undo 表空间。Slow Query Log慢查询日志记录执行时间超过long_query_time的 SQL用于优化慢查询。默认关闭需手动开启slow_query_log  ON。Error Log错误日志记录 MySQL 启动、运行、关闭过程中的错误信息用于排查故障。必开启路径由log_error指定。4. 慢查询优化定位慢查询开启慢查询日志sql
SET GLOBAL slow_query_log  ON;
SET GLOBAL long_query_time  2; -- 阈值秒
SET GLOBAL slow_query_log_file  /var/log/mysql/slow.log;
使用EXPLAIN分析执行计划关注type访问类型ALL全表扫描ref/range走索引。key实际使用的索引NULL表示未走索引。rows预估扫描行数值越小越好。ExtraUsing filesort文件排序需优化、Using index覆盖索引优。优化措施索引优化添加缺失索引修复失效索引如避免函数操作索引列。SQL 改写拆分复杂查询、避免SELECT *用覆盖索引、用JOIN代替子查询。数据库调优调整innodb_buffer_pool_size建议设为内存 50%-70%、分库分表数据量超千万时。三、Redis 缓存1. 数据结构数据类型底层结构核心特点应用场景String简单动态字符串SDS二进制安全可存文本、图片支持INCR/DECR自增自减缓存用户信息、计数器阅读量、分布式 IDHash哈希表数组  链表键值对集合field-value适合存储对象存储用户信息user:1 {name: a, age: 20}List双向链表  压缩列表元素少且小有序可重复支持LPUSH/RPOP两端操作消息队列、最新列表热搜前 10Set哈希表  整数集合元素为整数且少无序唯一元素支持SINTER交集/SUNION并集标签文章标签去重、共同好友ZSet跳跃表  哈希表按score排序元素唯一支持ZRANK排名排行榜游戏积分、延迟队列按时间 score 排序2. 持久化持久化方式原理优点缺点RDB定时生成内存快照.rdb 文件通过SAVE阻塞或BGSAVE后台线程触发。恢复速度快直接加载二进制文件、文件小可能丢失最后一次快照后的修改如突发宕机。AOF记录所有写命令追加到.aof 文件通过appendfsync控制同步策略always/everysec/no。数据安全性高everysec最多丢 1 秒数据文件大命令冗余、恢复速度慢需重放命令。混合持久化Redis 4.0AOF 文件开头为 RDB 快照后续为增量命令兼顾两者优点aof-use-rdb-preamble yes开启。3. 主从复制流程从节点执行SLAVEOF master-ip port建立连接。主节点执行BGSAVE生成 RDB发送给从节点全量复制。从节点加载 RDB 后主节点通过repl_backlog_buffer同步增量写命令增量复制。问题及解决数据延迟主从异步复制导致从库数据滞后适合读多写少场景写主读从。脑裂网络分区时从库被误认为主库导致数据不一致。解决min-slaves-to-write  1主库至少 1 个从库连接才允许写。4. 缓存问题缓存三兄弟问题原因解决方案缓存穿透查询不存在的数据如id-1缓存和 DB 都无数据请求直达 DB。1. 布隆过滤器提前过滤不存在的 key2. 缓存空值短期有效如 5 分钟。缓存击穿热点 key 过期瞬间大量并发请求直达 DB。1. 互斥锁Redis SETNX只让一个线程更新缓存2. 热点 key 永不过期后台异步更新。缓存雪崩大量 key 同时过期或缓存集群宕机请求全压到 DB。1. 随机过期时间避免集中过期2. 缓存集群主从  哨兵3. 服务降级 / 限流。5. 常见用途缓存存储高频访问数据如商品详情减轻数据库压力设置合理 TTL 避免雪崩。分布式锁SET key value NX PX 30000NX不存在才设置PX30 秒过期释放锁时验证 value避免误删。排行榜ZSET 的ZADD更新分数、ZREVRANGE获取 TopN实现实时排名。计数器INCR/DECR原子操作适合阅读量、点赞数等。消息队列List 的LPUSH生产者和BRPOP消费者阻塞弹出实现简单队列。6. 引入组件的考虑因素必要性是否解决核心问题如缓存是否真能提升性能避免过度设计。性能吞吐量QPS、延迟响应时间是否满足业务需求Redis 单机 QPS 可达 10 万 。运维成本部署、监控INFO命令、Prometheus、扩缩容难度集群是否支持动态添加节点。社区支持文档完善度、版本更新频率Redis 社区活跃问题解决快。数据一致性与数据库的同步策略Cache-Aside、Write-Through是否可控。7. 高可用方案模式原理特点适用场景主从复制主节点写入从节点同步数据并提供读服务一主多从。部署简单提升读吞吐量主节点故障需手动切换。读多写少可用性要求不高。哨兵Sentinel哨兵集群监控主从节点主节点故障时自动选举新主节点故障转移。自动故障转移高可用需至少 3 个哨兵节点避免脑裂。生产环境基础高可用方案。Cluster 集群数据分片到 16384 个槽Slot每个节点负责部分槽多主多从每个主节点有从节点。水平扩展动态添加节点、高可用支持跨节点操作MGET需指定槽。数据量大超 10GB、高并发场景。8. Redis Cluster 的插槽Slot作用数据分片CRC16(key) % 16384计算 key 所属槽每个节点负责部分槽如 3 个主节点各负责5461 个槽实现数据分布式存储。路由转发客户端连接任一节点若 key 不在当前节点负责的槽节点返回MOVED指令指引至目标节点。动态扩容槽可在节点间迁移CLUSTER MIGRATE无需停机迁移过程中双写保证数据一致性。四、Spring 框架1. IOC控制反转核心思想将对象创建、依赖管理交给 Spring 容器而非手动new对象降低耦合。依赖注入方式Autowired按类型注入默认配合Qualifier按名称注入。Resource按名称注入默认无名称时按类型注入JDK 注解非 Spring。构造器注入通过构造方法传递依赖推荐避免循环依赖问题。Bean 初始化流程读取配置XML / 注解→ 2. 解析为BeanDefinition → 3. 实例化new对象→ 4. 依赖注入填充属性→ 5. 初始化PostConstruct、InitializingBean等→ 6. 放入容器。2. AOP面向切面编程原理基于动态代理在不修改源码的情况下为方法添加额外功能如日志、事务。JDK 代理目标类实现接口时Proxy.newProxyInstance()生成代理类实现同一接口。CGLIB 代理目标类无接口时Enhancer生成子类代理重写目标方法无法代理final类 / 方法。核心概念切面Aspect封装横切逻辑的类如日志切面。切点Pointcut定义拦截哪些方法如execution(* com.xxx.service.*(..))。通知Advice切点执行时的动作Before前置、After后置、Around环绕等。应用场景日志记录、事务管理Transactional、权限校验、性能监控。3. Bean 生命周期实例化容器通过构造方法创建 Bean 对象new。属性赋值注入依赖Autowired/setter 方法。初始化执行Aware接口回调BeanNameAware、ApplicationContextAware等。执行PostConstruct注解方法JSR-250 规范初始化前。执行InitializingBean.afterPropertiesSet()方法Spring 接口。执行自定义init-methodXML 配置或Bean(initMethod)。使用Bean 放入容器供其他组件调用。销毁执行PreDestroy注解方法JSR-250 规范销毁前。执行DisposableBean.destroy()方法Spring 接口。执行自定义destroy-methodXML 配置或Bean(destroyMethod)。4. 循环依赖解决场景A 依赖 BB 依赖 A。Spring 通过三级缓存解决单例 Bean 循环依赖一级缓存singletonObjects存放完全初始化的 Bean。二级缓存earlySingletonObjects存放半成品 Bean已实例化未赋值。三级缓存singletonFactories存放 Bean 工厂用于生成代理对象。流程A 实例化后放入三级缓存 → 2. A 需要注入 B容器初始化 B → 3. B 需要注入 A从三级缓存获取 A 的早期引用若 A 需代理通过工厂生成代理放入二级缓存 → 4. B 初始化完成注入 A放入一级缓存 → 5. A 注入 B完成初始化放入一级缓存移除二、三级缓存。五、消息队列Kafka1. 消息不丢失保证环节措施生产者- acksall消息需被所有 ISR同步副本确认后才算发送成功。- 开启重试retriesN发送失败自动重试。- 用linger.ms批量发送减少网络开销。Broker- replication.factor≥3每个分区至少 3 个副本。- min.insync.replicas≥2ISR 中至少 2 个副本存活才允许写入。- 禁用unclean.leader.election.enable不允许非 ISR 副本成为 leader。消费者- 关闭自动提交enable.auto.commitfalse手动提交偏移量commitSync()。- 处理完消息后再提交避免消费失败但已提交偏移量。- 幂等处理通过消息 ID 去重防止重复消费。六、设计模式1. 单例模式Singleton Pattern概念保证一个类在整个应用中只有一个实例并提供一个全局访问点。核心思想通过私有化构造方法防止外部直接创建实例在类内部自行创建唯一实例并提供静态方法供外部获取。适用场景全局配置类如读取配置文件的工具类确保配置信息一致。数据库连接池避免频繁创建和关闭连接带来的性能损耗。日志工具类保证日志输出的一致性和顺序性。注意点需考虑线程安全问题如懒汉式需加锁以及反射、序列化对单例的破坏。2. 工厂模式Factory Pattern包括简单工厂、工厂方法、抽象工厂三种形式简单工厂模式概念由一个工厂类根据传入的参数动态决定创建哪一种产品类的实例。适用场景产品种类较少且固定如不同类型的日志记录器文件日志、控制台日志的创建。工厂方法模式概念定义一个创建产品的接口由子类决定具体创建哪种产品将产品创建延迟到子类。适用场景产品种类可能扩展如不同数据库MySQL、Oracle的连接工厂新增数据库时只需新增对应的工厂子类。抽象工厂模式概念提供一个接口用于创建一系列相关或相互依赖的产品族而无需指定具体类。适用场景需要创建多个产品族且产品族内的产品相互关联如不同操作系统Windows、Mac下的按钮、文本框等组件族的创建。3. 观察者模式Observer Pattern概念定义对象间的一种一对多依赖关系当一个对象被观察者状态发生改变时所有依赖它的对象观察者会自动收到通知并更新。核心思想解耦被观察者和观察者两者通过抽象接口交互互不依赖具体实现。适用场景事件监听机制如 GUI 中的按钮点击事件多个组件监听同一按钮。消息通知系统如公众号推送订阅者接收消息。状态变化同步如股票价格更新多个指标面板实时刷新。4. 装饰器模式Decorator Pattern概念动态地给一个对象添加额外的职责同时不改变其原有的结构。相比继承更灵活地扩展功能。核心思想通过创建装饰器类包裹原对象装饰器实现与原对象相同的接口并在调用原对象方法前后添加新功能。适用场景功能需要动态扩展且可组合的场景如 IO 流BufferedInputStream 装饰 FileInputStream增加缓冲功能。避免使用多层继承导致的类爆炸如给咖啡添加不同配料牛奶、糖每种配料作为一个装饰器。5. 适配器模式Adapter Pattern概念将一个类的接口转换成客户端期望的另一个接口使原本因接口不兼容而无法一起工作的类能够协同工作。核心思想创建适配器类实现目标接口并持有被适配类的实例在适配器方法中调用被适配类的对应方法。适用场景集成第三方组件其接口与本地系统接口不匹配时如第三方支付接口适配本地支付服务。旧系统改造需复用旧类但接口不符合新需求时。分类类适配器通过继承被适配类实现适配单继承限制较少使用。对象适配器通过持有被适配类实例实现适配更灵活常用。6. 代理模式Proxy Pattern概念为其他对象提供一种代理以控制对原对象的访问。代理对象在原对象和客户端之间起到中介作用。核心思想代理类与原对象实现同一接口客户端通过代理类访问原对象代理类可在调用原对象方法前后添加额外逻辑。适用场景远程代理为远程对象如分布式服务提供本地代理屏蔽网络通信细节。安全代理控制对敏感对象的访问如权限校验。延迟加载在真正需要时才创建 heavy 资源如大图片加载前的代理。AOP面向切面编程如 Spring 的事务管理通过代理在方法执行前后添加事务控制逻辑。7. 模板方法模式Template Method Pattern概念定义一个操作中的算法骨架将某些步骤延迟到子类中实现。子类可重写具体步骤但不改变算法的整体结构。核心思想父类中定义模板方法包含算法骨架并将可变步骤声明为抽象方法由子类实现。适用场景多个子类有共同的操作流程但部分步骤实现不同如数据库访问连接、执行 SQL、关闭连接的流程固定SQL 语句和结果处理可变。框架设计中定义核心流程允许用户自定义部分逻辑如 Servlet 的 doGet/doPost 方法由框架控制调用时机。8. 策略模式Strategy Pattern概念定义一系列算法将每个算法封装起来并使它们可相互替换让算法的变化独立于使用算法的客户端。核心思想创建策略接口不同算法实现该接口客户端持有策略接口的引用可动态切换不同的策略实现。适用场景存在多种类似的算法且需要根据场景动态选择时如排序算法可根据数据量选择冒泡、快排、归并等。避免使用多重条件判断if-else/switch如电商平台的折扣策略新用户折扣、会员折扣、节日折扣等。9. 迭代器模式Iterator Pattern概念提供一种方法顺序访问聚合对象中的元素而无需暴露聚合对象的内部结构。核心思想定义迭代器接口包含 hasNext、next 等方法聚合对象提供获取迭代器的方法客户端通过迭代器遍历元素。适用场景需统一遍历不同聚合结构如数组、链表、集合的场景如 Java 中的 Iterator 接口可遍历 List、Set 等不同集合。避免聚合对象暴露内部实现如自定义容器类通过迭代器提供安全的遍历方式。10. 命令模式Command Pattern概念将一个请求封装为一个对象使请求的发送者和接收者解耦。发送者只需发送命令对象无需知道接收者如何处理。核心思想创建命令接口包含执行方法具体命令类实现接口并持有接收者引用发送者持有命令对象通过调用命令的执行方法完成请求。适用场景需记录、撤销、重做请求的场景如文本编辑器的撤销操作每个编辑命令可被保存和反向执行。事件驱动系统如 GUI 中的按钮点击按钮持有命令对象点击时执行命令。批量任务处理如任务队列每个任务封装为命令依次执行。