
Android 面试面向对象六大原则深度解析前言作为一名有多年经验的 Android 开发者在面试中经常会被问到设计原则相关的问题。其中“谈谈你对面向对象六大原则的理解尤其是开闭原则和依赖倒置原则”几乎是必考题。本文结合自己的实战经验对六大原则进行深入剖析并解答一个经典追问“其他五大原则都是开闭原则的体现吗”一、六大原则核心速览面向对象六大设计原则的核心目标只有一个应对软件中的“变化”让代码更易维护、更易扩展。原则核心思想一句话理解开闭原则 (OCP)对扩展开放对修改关闭加功能别改老代码依赖倒置原则 (DIP)依赖抽象而非具体实现面向接口编程里氏替换原则 (LSP)子类必须能无缝替换父类儿子不能坑爹单一职责原则 (SRP)一个类只负责一件事别让类成为“万金油”接口隔离原则 (ISP)接口要小而专一别强迫别人用不需要的方法迪米特法则 (LoD)只和朋友说话减少内部细节暴露二、开闭原则详解面试重点2.1 定义软件实体类、模块、函数应该对扩展开放对修改关闭。核心思想当需求变化时应该通过增加新代码来实现功能而不是修改已有的老代码。改动老代码有引入新 Bug 的风险而稳定运行的代码不应该被频繁触碰。2.2 Android 实战案例案例一自定义 View 扩展系统TextView不支持圆角我们不会去改 SDK 源码而是继承它并重写onDrawpublicclassRoundCornerTextViewextendsTextView{OverrideprotectedvoidonDraw(Canvascanvas){// 通过 Canvas 裁剪实现圆角对原有 TextView 零侵入canvas.clipPath(roundPath);super.onDraw(canvas);}}这就是典型的“对扩展开放对修改关闭”。案例二策略模式处理多类型支付定义支付策略接口每种支付方式独立实现publicinterfacePayStrategy{voidpay(StringorderId,doubleamount,PayCallbackcallback);}publicclassWechatPayimplementsPayStrategy{/*...*/}publicclassAliPayimplementsPayStrategy{/*...*/}新增支付方式时只需新增一个实现类支付管理模块的核心代码完全不动。案例三BaseActivity 模板方法模式publicabstractclassBaseActivityextendsAppCompatActivity{OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(getLayoutResId());initView();initData();}protectedabstractintgetLayoutResId();protectedabstractvoidinitView();protectedabstractvoidinitData();}基类的流程框架对修改关闭子类只需填充具体内容完美符合开闭原则。三、依赖倒置原则详解面试重点3.1 定义高层模块不应该依赖低层模块二者都应该依赖其抽象。 抽象不应该依赖细节细节应该依赖抽象。这条原则彻底颠覆了传统“自顶向下逐层依赖”的设计方式是解耦的核心利器。3.2 Android 实战案例在 MVP 或 MVVM 架构中依赖倒置无处不在// View 层只依赖 Presenter 接口抽象publicclassMainActivityextendsBaseActivityimplementsMainContract.View{privateMainContract.PresentermPresenter;}// Presenter 依赖 Model 接口抽象publicclassMainPresenterimplementsMainContract.Presenter{privateMainContract.ModelmModel;publicMainPresenter(MainContract.Viewview,MainContract.Modelmodel){this.mViewview;this.mModelmodel;}}// Model 的具体实现可以随意替换publicclassMainModelimplementsMainContract.Model{// 可以是网络、数据库、或 Mock 数据}这样做的好处**可测试性**单元测试时轻松 Mock 一个假的 Model**可替换性**换数据库只改 Model 实现View 和 Presenter 无感知四、经典追问其他原则都是开闭原则的体现吗这是一个很有深度的问题。直接回答不完全是但它们是实现开闭原则的核心手段和具体体现。我愿把它们的关系理解为目标和路径。开闭原则是总纲和最终目标其他五大原则是为实现这个目标服务的战术约束。4.1 依赖倒置原则 —— 实现开闭的基石没有依赖倒置开闭原则几乎无从谈起。只有高层和低层都依赖抽象才能在低层变化时不影响高层或者通过扩展新实现来应对变化。4.2 单一职责原则 —— 隔离变化波及开闭原则要求对修改关闭。如果一个类承担了过多职责任何一个职责的变化都可能成为修改它的理由。拆开职责每个类只有一个变化的原因才能做到“改一处而其他不动”。4.3 接口隔离原则 —— 提供精准的扩展粒度臃肿的接口让扩展变味。小而专的接口让新功能的扩展只需实现真正需要的方法这才是“对扩展开放”的最佳姿态。4.4 里氏替换原则 —— 保证扩展安全开闭允许通过子类扩展但如果子类不能无缝替换父类这个“扩展”就会破坏现有逻辑迫使上层为兼容它而修改。LSP 是所有扩展安全运行的基石。4.5 迪米特法则 —— 缩小修改影响面如果一个对象暴露太多内部细节耦合面就大内部变化时所有依赖者都可能要改。迪米特限制知识扩散让变化被限制在小范围内间接支持了“对修改关闭”。五、总结开闭原则是最终愿景是我们追求的理想代码状态。依赖倒置是核心手段通过抽象建立稳定的契约层。单一职责、接口隔离、里氏替换、迪米特法则是具体约束从不同维度保证扩展的可行性与安全性。理解这些原则之间的关系比死记硬背定义重要得多。在实际的 Android 开发中灵活运用它们才能写出经得起需求变更考验的优质代码。如果这篇文章对你有帮助欢迎点赞、收藏、关注你的支持是我持续分享的动力