后端技术面试 38 讲
李智慧
同程艺龙交通首席架构师,前 Intel& 阿里架构师,《大型网站技术架构》作者
37373 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
不定期加餐 (1讲)
后端技术面试 38 讲
15
15
1.0x
00:00/00:00
登录|注册

16 | 设计模式基础:不会灵活应用设计模式,你就没有掌握面向对象编程

对多态的灵活应用
模式是可重复的解决方案
接口隔离原则
单一职责原则
里氏替换原则
依赖倒置原则
开闭原则
精通设计模式
实践中不断使用设计模式
灵活应用设计模式
装饰模式
设计模式
设计原则
多态
继承
封装
面向对象编程与面向过程编程的核心区别
面向对象编程的本质
对象的定义
思考题
总结
设计模式的精髓
面向对象编程的特性
面向对象编程的本质
设计模式基础

该思维导图由 AI 生成,仅供参考

我在面试的时候,喜欢问一个问题:“你比较熟悉哪些设计模式?”得到的回答很多时候是“单例”和“工厂”。老实说,这个回答不能让人满意。因为在我看来,单例和工厂固然是两种经典的设计模式,但是,这些创建类的设计模式并不能代表设计模式的精髓。
设计模式的精髓在于对面向对象编程特性之一——多态的灵活应用,而多态正是面向对象编程的本质所在。

面向对象编程的本质是多态

我在面试时,有时候会问“什么是对象”,得到的回答各种各样:“对象是数据与方法的组合。”“对象是领域的抽象。”“一切都是对象。”“对象的特性就是封装、继承、多态。”
这是一个比较开放的问题,这些回答可以说都是对的,都描述了对象的某个方面。那么,面向对象的本质是什么?面向对象编程和此前的面向过程编程的核心区别是什么?
我们常说,面向对象编程的主要特性是封装、继承和多态。那么这三个特性是否是面向对象编程区别于其他编程技术的关键呢?
我们先看封装,面向对象编程语言都提供了类的定义。通过类,我们可以将类的成员变量和成员方法封装起来,还可以通过访问控制符,private、protected、public 控制成员变量和成员方法的可见性。
面向对象设计最基本的设计粒度就是类。类通过封装数据和方法,构成一个相对独立的实体。类之间通过访问控制的约束互相调用,这样就完成了面向对象的编程。但是,封装并不是面向对象编程语言独有的。面向过程的编程语言,比如 C 语言,也可以实现封装特性,在头文件.h 里面定义方法,而在实现文件.c 文件里定义具体的结构体和方法实现,从而使依赖.h 头文件的外部程序只能够访问头文件里定义过的方法,这样同样实现了变量和函数的封装,以及访问权限的控制。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

面向对象编程的核心是多态,而多态正是面向对象编程的本质所在。文章中指出,面向对象编程的主要特性是封装、继承和多态。封装通过类的定义实现数据和方法的封装,继承可以在C语言中实现,而多态则是面向对象编程的核心。多态使得程序针对接口和抽象类编程,而不需要关心具体实现是什么,实现了软件编程时的实现无关性。多态还颠覆了程序模块间的依赖关系,使得模块之间的依赖关系倒置,实现了依赖倒置原则。通过多态的特性,程序可以表现出不同的形态,实现了面向对象编程的灵活性和可扩展性。设计模式的精髓是对多态的灵活应用,通过设计模式,程序呈现多态的特性,进而使程序健壮、灵活、清晰、易于维护和复用。真正掌握设计模式,需要在实践中不断使用它,让自己的程序更加健壮、灵活、清晰、易于复用和扩展。文章还提到了设计原则和设计模式的关系,以及如何通过设计模式灵活应用多态特性。文章以装饰模式为例,展示了多态特性的灵活应用。通过不断的编程实践和对设计模式的灵活应用,才能真正掌握面向对象编程。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端技术面试 38 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • 达芬奇
    置顶
    精通设计模式就是再无设计模式,寡闻了,第一次听说
    2022-11-05归属地:北京
    1
  • Farewell丶
    ``` public class DefaultModule implements Module { private final String value; public DefaultModule(String value) { this.value = value; } @Override public void print() { System.out.println(value); } } ``` ``` public class ComponentModule implements Module { private final Module currentModule; private final List<Module> modules; public ComponentModule(Module currentModule, Module... modules) { this.currentModule = currentModule; this.modules = Arrays.asList(modules); } @Override public void print() { this.currentModule.print(); this.modules.forEach(Module::print); } } ``` ``` public interface Module { void print(); static void main(String[] args) { ComponentModule subModule31 = new ComponentModule( new DefaultModule("31"), new DefaultModule("311"), new DefaultModule("312"), new DefaultModule("313") ); ComponentModule subModule3 = new ComponentModule( new DefaultModule("3"), subModule31, new DefaultModule("32"), new DefaultModule("33") ); ComponentModule module = new ComponentModule( new DefaultModule("0"), new DefaultModule("1"), new DefaultModule("2"), subModule3 ); module.print(); } } ``` 这样歪

    作者回复: 👍

    2020-01-16
    17
  • Jesse
    使用组合模式遍历树:我的想法是,每棵树都可以看成是根节点和子树(左子树,右子树)的组合。因此在定义节点Node的时候,就可以持有两个子树根节点的的引用(left,right),这也是一般链式结构树的实现,用到的就是组合模式。而树的遍历,就可以递归的遍历所有的子树了。

    作者回复: 问题是:不用递归如何遍历树?

    2019-12-30
    3
  • UncleNo2
    原来装饰器模式是用来写诗的,看来我误解它了
    2020-06-22
    2
    14
  • escray
    看了前面几讲,确实能感觉到多态才是面向对象的精髓。 以前编码的过程中,其实没怎么用过设计模式,老师给出的“标准答案”确实不错,我打算去认真学习一下组合、模板和策略这三种模式,不能只靠单例和工厂这种简单模式应付面试。 @UncleNo2 留言里面说,“装饰器模式是用来写诗的”,倒还真是应景。代码并不复杂,但是想要搞清楚调用关系,还是需要琢磨一下的。 手工敲了一遍 @Farewell丶 留言中的代码,体验了一下组合模式遍历树。
    2020-09-25
    4
  • Geek_d68bf9
    侃侃而谈,但也是泛泛而谈
    2022-04-20
    3
  • 蓝魔丶
    每个子类构造函数传入父类实现组合,通过递归获取父类
    2019-12-27
    3
  • 尹宗昌
    无招胜有招
    2019-12-27
    2
  • Andrew
    精通设计模式,就是忘了什么是设计模式,但是程序和架构又是健壮、灵活、清晰、易于复用和扩展的,臻于武学最高境界,很赞👍
    2022-10-05归属地:河南
    1
  • java小霸王
    适配器和装饰器模式的区别?组合模式具体是?后面再来补坑
    2022-06-29
    1
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部