面向对象编程(OOP)及其高级应用的核心知识体系,适用于软件工程、系统设计与架构。以下是对各要点的精要梳理与关键说明:
✅封装、继承、多态
- 封装:隐藏内部实现细节,通过访问控制(private/protected/public)和公共接口(getter/setter、方法)暴露行为;提升安全性与可维护性。
- 继承:子类复用父类属性与方法(
extends/:),支持代码重用与层次建模;注意避免过深继承链。 - 多态:同一接口/父类型引用可指向不同子类实例,运行时动态绑定(动态分派),体现为“一个接口,多种实现”(如
Animal a = new Dog(); a.speak();)。
✅类与对象
- 类是抽象模板(定义属性+方法),对象是类的实例(内存中具体存在);类描述“是什么”,对象表示“哪一个”。
✅抽象类 vs 接口
| 特性 | 抽象类 | 接口(Java 8+ / C#) |
|---|---|---|
| 构造器 | ✅ 可有 | ❌ 不可有 |
| 成员变量 | 可为任意访问级别,可含具体值 | 默认public static final常量 |
| 方法实现 | 可含抽象 + 具体方法 | Java 8+ 支持default/static方法;C# 支持默认实现(C# 8.0+) |
| 继承限制 | 单继承 | 多实现(类可implements多个接口) |
| 设计意图 | “is-a”关系,共享核心行为与状态 | “can-do”能力契约,强调行为规范 |
✅UML类图关系(由强到弱)
- 组合(Composition):强整体-部分关系,部分生命周期依赖整体(如
Car与Engine,Engine不能脱离Car存在)→ 实心菱形+实线。 - 聚合(Aggregation):弱整体-部分,部分可独立存在(如
Department与Employee)→ 空心菱形+实线。 - 关联(Association):一般结构关系(如
Student↔Course),可双向/单向,可标注角色、多重性(1…*)。 - 依赖(Dependency):临时使用关系(如方法参数、局部变量),虚线箭头 → 表示“use-a”。
- 泛化(Generalization):继承关系,空心三角+实线,指向父类(
Dog→Animal)。 - 实现(Realization):类实现接口,空心三角+虚线,指向接口(
PaymentService→IPayment)。
✅SOLID 设计原则
- SRP(单一职责):一个类只负责一个功能领域(如
UserRepository仅处理数据持久化,不处理验证)。 - OCP(开闭原则):对扩展开放,对修改关闭(通过抽象、策略/模板模式实现)。
- LSP(里氏替换):子类对象必须能替换父类对象而不破坏程序逻辑(禁止在子类中加强前置条件或削弱后置条件)。
- ISP(接口隔离):客户端不应依赖它不需要的接口(拆分胖接口为多个细粒度接口)。
- DIP(依赖倒置):依赖抽象(接口/抽象类),而非具体实现;高层模块不依赖低层模块,二者都依赖抽象。
✅GoF 23种设计模式(重点9种简析)
| 模式 | 类型 | 核心意图 | 典型场景 |
|---|---|---|---|
| 单例 | 创建型 | 保证全局唯一实例,控制资源访问 | 配置管理器、日志器、线程池 |
| 工厂方法/抽象工厂 | 创建型 | 解耦对象创建逻辑,支持产品族扩展 | GUI库(WinButton/OSXButton) |
| 观察者 | 行为型 | 定义一对多依赖,状态变更自动通知订阅者 | 事件驱动(GUI监听、消息总线) |
| 策略 | 行为型 | 封装算法族,运行时切换行为 | 支付方式(Alipay/WechatPay)、排序算法 |
| 装饰器 | 结构型 | 动态添加职责,替代继承(符合OCP) | Java I/O流(BufferedInputStream)、权限增强 |
| 代理 | 结构型 | 为对象提供代理以控制访问 | 远程代理(RMI)、虚拟代理(延迟加载)、保护代理(权限校验) |
| 适配器 | 结构型 | 转换接口,使不兼容类协同工作 | Legacy API包装、第三方SDK适配 |
| 模板方法 | 行为型 | 定义算法骨架,子类重写特定步骤 | 框架流程(SpringJdbcTemplate) |
| 责任链 | 行为型 | 将请求沿链传递,各节点决定是否处理 | 审批流、过滤器链(Servlet Filter) |
✅MVC 架构模式
- Model:数据与业务逻辑(如实体、DAO、Service);
- View:用户界面(HTML、前端组件);
- Controller:协调者,接收输入、调用Model、更新View;
⚠️ 注意:现代演进为 MVP/MVVM(尤其前端),MVC 中 View 与 Model 通常不直接通信(解耦关键)。
✅AOP(面向切面编程)
- 核心思想:将横切关注点(如日志、事务、安全)模块化为切面(Aspect),通过织入(Weaving)动态注入目标对象;
- 关键概念:切点(Pointcut)、通知(Advice:Before/After/Around)、连接点(Join Point)、织入时机(编译期/类加载期/运行期);
- 实现:Spring AOP(基于代理)、AspectJ(更强大,支持字节码增强)。
✅反射机制(Java/C#)
- 运行时获取类信息(类名、方法、字段、注解)、动态创建对象、调用私有方法/访问私有字段;
- 应用:框架底层(Spring IOC、JUnit)、序列化、ORM(Hibernate)、注解处理器;
- ⚠️ 性能开销 & 安全风险(需
setAccessible(true)突破访问控制)。
✅序列化与反序列化
- 序列化:对象 → 字节流/文本(JSON/XML/Protobuf),用于网络传输或持久化;
- 反序列化:字节流 → 对象(需警惕反序列化漏洞,如 Java
ObjectInputStream的 gadget 链攻击); - 主流方案:Java
Serializable(需serialVersionUID)、Jackson(JSON)、Protocol Buffers(高效二进制)。
以上内容构成面向对象高阶能力的知识图谱,建议结合 UML 绘图工具(如 PlantUML、StarUML)实践类图建模,并用真实项目(如电商订单系统)贯穿练习设计模式与 SOLID 原则。