设计模式之美
王争
前Google工程师,《数据结构与算法之美》专栏作者
立即订阅
17458 人已学习
课程目录
已更新 20 讲 / 共 100 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 (1讲)
开篇词 | 一对一的设计与编码集训,让你告别没有成长的烂代码!
免费
设计模式学习导读 (3讲)
01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?
02 | 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?
03 | 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
设计原则与思想:面向对象 (11讲)
04 | 理论一:当谈论面向对象的时候,我们到底在谈论什么?
05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?
06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?
07 | 理论四:哪些代码设计看似是面向对象,实际是面向过程的?
08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?
09 | 理论六:为什么基于接口而非实现编程?有必要为每个类都定义接口吗?
10 | 理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?
11 | 实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
13 | 实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?
14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
设计原则与思想:设计原则 (3讲)
15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?
16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
17 | 理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?
不定期加餐 (2讲)
加餐一 | 用一篇文章带你了解专栏中用到的所有Java语法
加餐二 | 设计模式、重构、编程规范等相关书籍推荐
设计模式之美
登录|注册

01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?

王争 2019-11-04
我相信,很多程序员都已经意识到基础知识的重要性,觉得要夯实基础,才能走得更远,但同时对于如何将基础知识转化成开发“生产力”仍然有些疑惑。所以,你可能看了很多基础的书籍,比如操作系统、组成原理、编译原理等,但还是觉得很迷茫,觉得在开发中用不上,起码在平时的 CRUD 业务开发中用不上。实际上,这些基础的知识确实很难直接转化成开发“生产力”。但是,它能潜移默化地、间接地提高你对技术的理解。
不过,我觉得,设计模式和操作系统、组成原理、编译原理等这些基础学科是不一样的。它虽然也算是一门基础知识,但是它和数据结构、算法更像是一道儿的,相比那些更加基础的学科,设计模式能更直接地提高你的开发能力。我在开篇词里也说了,如果说数据结构和算法是教你如何写出高效代码,那设计模式讲的是如何写出可扩展、可读、可维护的高质量代码,所以,它们跟平时的编码会有直接的关系,也会直接影响到你的开发能力。
不过,你可能还是会觉得设计模式是把屠龙刀,看起来很厉害,但平时的开发根本用不上。基于这种观点,接下来,我们就具体地聊一聊,我们为什么要学习设计模式?

1. 应对面试中的设计模式相关问题

学习设计模式和算法一样,最功利、最直接的目的,可能就是应对面试了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《设计模式之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(328)

  • 丁丁历险记
    笔记:
    1 作者反复解释了下学好dp 的重要性。
    映像深刻的:
    基本功不够,把一台战斗机放你面前,你都不知道如何欣赏和品味。
    其它职能:
    1 面试所需(适当的区分度)
    2 告别烂代码,让实现优雅起来。老司机后,要参与指导菜鸟,也要会。
    3 show me the code ,你牛不牛,终归还需要代码的展现,把框架说得头头是道又如何,技术看技术,硬核不行,外表的东西白搭。没法成为别人心中的大牛的。

    作业:聊看法。
    一句话,简直太tmd 的重要了。

    以前重构过一个p2p 客户投资后奖励活动【放心,平台未跑路,老板是用心做事的人】。 刚开始,他们真的是 if eles 的去写每一个活动。
    我去了后。主要就是参考yii 框架的实现方法。
    做了以下解藕,把购买后的奖励分为四块。
    通过配置 rules 来确认是否有奖励资格。 【首次,】
    清算出奖多少,奖给谁(通常会带上推荐人)【固定额,阶梯算法,比例值,vip 等级等】
    创建出奖励执行类, (红包,现金,抽奖券 , 积分等) 并执行奖励
    发送通知 (站内信,短信,微信,邮件 , ) (通知会在通知里挂接广告)
    离开那公司时特意查了一下,公司共发布了1700 条个奖励项,给客户返利约900 万。
    2019-11-04
    11
    119
  • 嚴脂红.*
    做游戏开发相关的工作,日常用到非常多的设计模式,比如:

    对于游戏的设置,ui和scene等等各种manager管理类都要用到单例模式。
    创建游戏中各种角色的各种工厂模式还有对象池。
    处理游戏角色的各种状态的有限状态机要用到状态模式。
    在优化复杂游戏场景时会用到享元模式。
    还有游戏引擎本身就用到的组件模式。
    ......
    2019-11-04
    2
    44
  • jony
    设计模式,两眼一抹黑,从0开始
    2019-11-05
    39
  • 个人认为设计模式主要解决的是扩展和耦合问题

    日常使用:

    使用代理模式进行共性化处理,比如说 AOP 思想,将非业务功能和业务功能解耦

    * 事务的处理@Translation
    * 系统间上下文的传递 ThreadLocal + restTemplate#intercept 等等

    使用工厂 + 策略

    * 不同优惠种类的计算
    * 定制化功能的解耦

    观察者模式:这个模式的思想,我觉得非常的重要,你可以在许多中间件(mq、zookeeper、netty 等等)乃至生活中都能看到它的影子

    * 通过领域事件解耦业务
    * 理解 eventloop、epoll 等等
    * 通过 watch 实现动态配置、HA 等等

    责任链模式:pipeline 思想

    * filter
    * 理解 netty 中的各种 handler
    2019-11-04
    1
    25
  • 谭棋钊
    只用过单例
    2019-11-04
    17
  • 梁军
    个人感觉,设计模式和数据结构算法结合,再去读源码或者框架,很清晰,一个招式一个内功
    2019-11-04
    15
  • 仰望星空
    老师能不能讲讲函数式编程思想,设计模式都是基于面向对象的,而现在更流行函数式编程。

    作者回复: 函数式编程感觉还是没面向对象流行 所以专栏中没讲

    2019-11-04
    2
    13
  • 编程界的小学生
    1.设计模式很主要,很主要,很主要。他是一个能够长久迭代开发的必要条件,也是一个提高开发效率的必要条件。当我第一次用设计模式的时候我激动的一晚上没睡好,反反复复去看我的代码,喜欢的不得了。我会对照我的代码思考需求变更我的代码应该改什么,那种解耦合,可扩展的架构真的喜欢!!!

    2.单例、工厂、模板、策略
    基本的套路就是:单例的工厂类负责创建策略类,但是每个策略类都有共同特性,所以用到了模板模式。
    类关系就是每个策略类实现策略接口并继承模板类。交由单例的工厂来管理。
    也有人说这就是模板。跟策略没关,但我认为确实也是策略。
    场景:医疗系统,药品分为中药,西药,医疗器械等等不同类别,每种类别计算价格方式由相同的算法和不同的算法组成,所以我用了模板和策略。👀
    补充:其实最后我发现spring有依赖搜索,直接注入map就行了。完全不用自己写工厂管理😂😂😂
    2019-11-04
    2
    12
  • 大王拍我去巡山
    CRUD写的太多了, 通过设计模式也能简化业务代码,释放生产力。期望能多有些代码场景的演练,跟随学习
    2019-11-05
    7
  • SweetyTang
    用的最多的是观察者模式,其它模式都不了解,有些太失败了😭😭😭
    2019-11-04
    6
    7
  • 1.个人觉得设计模式就是对一些写比较好的代码的总结,其实代码看的写的多了,也能写出自己的设计模式。
    2.最近重构了一块生成excel的代码,因为相似的代码很多,就用到了简单工厂模式和策略模式,工厂模式让对象的创建更加明确,策略模式让代码的逻辑看起来更加清晰、也解决一些代码重复的问题。
    2019-11-04
    6
  • 汤小高
    课后讨论:我的看法
    1.聊一聊你对设计模式相关知识的重要性的看法;
    (1)设计模式能让程序员编写出可读性高,易维护,易拓展的代码,避免烂代码。
    (2)利用好设计模式能让复杂功能的设计的代码可复用性,可拓展性,可维护性,可读性更高。达到高内聚、低耦合的目的。
    (3)设计模式能提高程序员的自我修养

    2.在你过往的项目开发中,有没有用过某种设计模式?是在什么场景下应用的?解决了什么问题?
    用到过模板模式,单例模式。
    2.1)模板模式应用场景:在一个项目的规则引擎中,一个规则引擎有一系列规则过滤,这个过滤步骤基本上是确定的,只是某些步骤在不同的场景下需要相互替换,模板方法定义了方法调用顺序,需要用到一个钩子,让子类去实现这个方法。
    模板模式解决问题:解决了以后可拓展的问题,如果以后需要在新场景下新增规则方法,只需新增一个类,实现钩子方法即可,不需改动既有代码。
    2.2)单例模式应用场景:用于加载项目中需要的配置文件的资源类。
    单例模式解决问题:解决了资源共用,避免创建出大量资源对象,节省了JVM内存资源。
    2019-11-04
    6
  • 时光之刃
    希望老师能举一些开源代码中的设计模式,比如netty或者ES等

    作者回复: 可以的 我后面可以考虑多写几篇加餐

    2019-11-05
    5
  • 于留月
    设计模式的重要性:
    1、提高设计和开发能力,从更高层次考虑问题:可读性、可维护性、可扩展性、模块化、组件化;
    2、读源码、学框架,深有体会,Android源码到处充斥着各式各样的设计模式和设计原则;
    3、职场发展,个人希望能够在架构和技术leader方面深入发展;
    4、高质量代码,避免坏代码,不想被同行嘲笑,不想被同事鄙视,不想被后期维护的人吐槽,想被人称赞;
    5、作为专业话术,更方便同行业间交流,更容易跟领导解释清楚,更轻松带领团队完成任务;

    使用经验:

    策略模式:
    解决开发、测试、预发布、生产环境不同的数据来源、不同的数据处理方式,以及不同的图片加载方式

    建造者模式:
    网络通信协议,非常规意义上的http请求,更多是Socket通信,需要处理大量的参数传递,包装,解析

    2019-11-05
    5
  • jiji87432
    1、设计模式的重要性看法:
    (1)可以使得代码编写更优雅
    (2)对学习一些开源框架有很大帮助
    (3)程序的可扩展性、维护性更好,系统解耦
    2、基于上面的看法结合实际项目说明:
    (1)在新老系统接割的项目中,进行数据回写,用到了策略模式,根据不同的接口码值,进行不同的策略回写。
    (2)在银行前置系统中,用到了模板设计模式,对接不同的三方通道,在模板中定义某些特定的步骤,并加上hook,具体步骤子类实现。
    (3)责任链模式,在网关系统中用到的filter就是责任链模式,把一个请求依次的在过滤器链上进行传输
    (4)装饰器模式,在普通的微服务提供的restful接口中,在请求返回的时给对象添加一些额外的职责
    (5)门面设计模式,对外提供统一的接口,例如在springcloud中提供统一的feinclient接口,所有外部系统都通过feinclient接口进行接入,从而不关心内部接口的调用实现。
    (6)还有命令设计模式,原来在看工作流的时候不知道这个模式,看的云里雾里,后来才知道原来整个框架用到了命令设计模式,一下子就明朗了很多。所以学习设计模式很重要。
    还有单例模式、工厂模式等,以上大概就是在工作中用到的设计模式,分享一下,如有不对请指正。
    2019-11-11
    4
  • 啊哈哈哈怕
    是不是适用设计模式也