设计模式之美
王争
前Google工程师,《数据结构与算法之美》专栏作者
立即订阅
17709 人已学习
课程目录
已更新 22 讲 / 共 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 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
设计原则与思想:设计原则 (5讲)
15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?
16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
17 | 理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?
18 | 理论四:接口隔离原则有哪三种应用?原则中的“接口”该如何理解?
19 | 理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?
不定期加餐 (2讲)
加餐一 | 用一篇文章带你了解专栏中用到的所有Java语法
加餐二 | 设计模式、重构、编程规范等相关书籍推荐
设计模式之美
登录|注册

14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?

王争 2019-12-04
在上一节课中,针对接口鉴权功能的开发,我们讲了如何进行面向对象分析(OOA),也就是需求分析。实际上,需求定义清楚之后,这个问题就已经解决了一大半,这也是为什么我花了那么多篇幅来讲解需求分析。今天,我们再来看一下,针对面向对象分析产出的需求,如何来进行面向对象设计(OOD)和面向对象编程(OOP)。

如何进行面向对象设计?

我们知道,面向对象分析的产出是详细的需求描述,那面向对象设计的产出就是类。在面向对象设计环节,我们将需求描述转化为具体的类的设计。我们把这一设计环节拆解细化一下,主要包含以下几个部分:
划分职责进而识别出有哪些类;
定义类及其属性和方法;
定义类与类之间的交互关系;
将类组装起来并提供执行入口。
实话讲,不管是面向对象分析还是面向对象设计,理论的东西都不多,所以我们还是结合鉴权这个例子,在实战中体会如何做面向对象设计。

1. 划分职责进而识别出有哪些类

在面向对象有关书籍中经常讲到,类是现实世界中事物的一个建模。但是,并不是每个需求都能映射到现实世界,也并不是每个类都与现实世界中的事物一一对应。对于一些抽象的概念,我们是无法通过映射现实世界中的事物的方式来定义类的。
所以,大多数讲面向对象的书籍中,还会讲到另外一种识别类的方法,那就是把需求描述中的名词罗列出来,作为可能的候选类,然后再进行筛选。对于没有经验的初学者来说,这个方法比较简单、明确,可以直接照着做。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《设计模式之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(91)

  • 辣么大
    干货满满!争哥拆分需求、组织类和方法的思考过程值得我们学习。

    我想到的实现过程是按照用户发送请求通过鉴权和未通过鉴权的流程写:
    1、先写接口auth(String url) ,这里先定义好请求的格式,例如“xxx?AppID=123&Token=aaa&TimeStamp=123123”
    2、ApiRequest类,解析请求
    3、AuthToken类,判断是否过期、token匹配、校验token
    4、CredentialStorate类,获取AppID对应的password

    具体实现见:https://github.com/gdhucoder/Algorithms4/tree/master/geekbang/designpattern/u014
    2019-12-04
    10
    24
  • 醉比
    前一个项目我也完整的实现了整个鉴权流程,需求分析阶段可以说和小争哥分析的功能点几乎一样,拼接参数,进行加密,验证token,验证时间。可到了编程阶段,我还是按照面向过程的方式,拆了几个方法,把功能就实现了。今天给我了一个深刻的感悟,面向对象编程,听起来并不复杂,但他真正的难点在于我学了这么多,对于下一个功能,是不是能够用面向对象的方式来把功能实现。如何做到学以致用,是我们学会知识后,接下来要考虑的问题。
    2019-12-04
    2
    15
  • 黄林晴
    打卡✔
    如果是我的话怕是理清功能后,写一个鉴权util,然后所有的方法都塞进去,典型的面向过程了😩
    2019-12-04
    3
    7
  • Peter Cheng
    看代码,我也是看的云里雾里的,希望老师能抽空将课程的代码写到github上

    作者回复: 好的 我放到github上 github上你搜wangzheng0822

    2019-12-04
    5
    5
  • 李小四
    设计模式_14
    我就是画画草稿图就开始写代码的那个人,画图可以避免复杂度在大脑中“爆炸”。。。

    # 感想:
    在入门阶段,我们会遵照一些方法论来行事,比如
    “寻找名词作为参数”,
    “寻找动词作为方法”
    ...
    这些方法通常都可以直接执行,一顿操作解决问题。
    时间久了,我们开始思考:
    - 为什么要这样做?
    - 这些方法的本身优势是什么?

    这个时候,我们才接近了分析的的本质,我们可能沿用这些方法,亦或找到更好的方法,不管怎样,都变得更通透。
    2019-12-04
    1
    5
  • bboy孙晨杰
    同样的需求我在代码里实现过,但是看了争哥的思路有种耳目一新的感觉;
    另外我有一点疑惑:“将 token、AppID、时间戳拼接到 URL 中,形成新的 URL”,这个功能点应该是在客户端完成的吧,服务端只需要在验证的时候解析URL,验证token就可以了吧,虽然也是一个功能点,但实际并不需要服务端考虑。
    2019-12-04
    3
    4
  • 落叶飞逝的恋
    组合关系:强调部分与整体的关系,其中包括两种情况,关联性强(大雁与翅膀)的与关联性弱(学生与班级)的。
    依赖关系:强调对象与对象的临时关系,人开车。
    2019-12-04
    3
  • Dimple
    对比一下整个流程,发现现在自己做的还是太草率了。

    我也知道写代码其实是整个开发过程中最简单的一件事情,只要前期准备工作做的好,把该分析的都分析清楚,写代码自然就是水到渠成的事情。

    但是我现在的做法是:

    1. 拿到需求之后,先判断需求是否可以同项目中复用;
    2. 然后拿一个小笔记本把涉及到的需求先设想下,包括类、DB等设计(用法很粗糙,没老师这么细致)
    3. 用伪代码先把小流程实现
    4. 写代码

    这里的薄弱环节就是不知道如何更好的使用设计模式,从第三步直接到了第四步,而不存在软件工程中UML的设计,导致很多时候代码写了很多,也一直是在做面向过程的事情,而不是面向对象。

    课程真的很赞,已经不能再夸了。好好跟着课程学习,收获满满,和同学们一起进步
    2019-12-04
    3
  • 陈华应
    需求分析过程中,或者分析完,不要直接就想着数据库表结构怎么设计。
    基本是按照老师说的这个流程分析下来,再对外暴露接口,最后是如何存储,存储的结构视存储方式而定,比如存到DB,Redis,MongoDB等等,还有可能会切换实现。
    整体就是做好需求分析拆解,根据功能边界模块划分,模块内部还可以分子模块,再做好每个模块内部功能分析实现,以及模块之间的协作。
    2019-12-04
    3
  • 编程界的小学生
    用这种需求分析需求设计的方式,你告诉我一个方法怎么可能超过五十行?编程规范都说方法单个不超过五十行,八十行的。到头来为什么还是超过?就是因为之前都是面向过程编程,token,url等操作都放到一个类的一个方法里面,要全面相过程编程。争哥的这种需求分析需求设计的方式值得学习和效仿,真的香!
    2019-12-04
    3
  • 密码123456
    我觉得,鉴权和url解析的类就是充血模型。就是domain,就是领域层
    2019-12-04
    3
  • Geek
    打卡,需要消化一下今天的课程
    2019-12-04
    3
  • Monday
    1、token加密采用md5
    2、执行测试类即可
    花了一小时完成了课后题,望纠正,一起学习.
    上代码: https://gitee.com/MondayLiu/geek-design.git
    2019-12-05
    2
  • 兔2🐰🍃
    有个问题就是:DefaultApiAuthencatorImpl 类里的构造函数名应该和类名一样的吧,还是说java哪个版本的新特性?

    作者回复: 写错了,我改下,抱歉。

    2019-12-04
    2
  • 付坤
    针对以往的贫血模型的开发经验,基本就是通过数据建模来实现的,都是先把需求拆分出实体,针对实体定义数据字段,也就是属性,再梳理出方法。这种思路就很难引导自己去进行抽象。最后出来的代码也就是面向过程了😂
    2019-12-04
    2
  • chanllenge
    写的太好了,这一次一定要把设计模式学会
    2019-12-04
    2
  • 与雨日肇事的爱
    打卡
    2019-12-04
    2
  • 帆大肚子
    目前我觉得需要学会的是转化自己的面向过程编程的思想
    2019-12-07
    1
  • Jony
    老师,我有个问题,当客户端跟服务端的时间不同步时,鉴权token不是都检验不通过了吗?怎么才能保证客户端跟服务端时间同步?
    2019-12-06
    2
    1
  • 陈迎春
    有关数据存储接口定义,有如下疑问: 数据存储会支持数据库(sqlite, mysql, redis)或者文本,那么我这个接口如何定义呢?我感觉下面的做法有点问题,就是数据库和文本存储方式接口不是很兼容


    目前做法是(python代码)
    class DataStorageInterface:
        """
        数据存储接口类
        """
        def write(self, cmd):
            pass

        def read(self, cmd):
            pass


    class SqliteStorage(DataStorageInterface):
        """
        sqlite存储类
        """
        def write(self, cmd):
            执行cmd,将数据插入数据库


        def read(self, cmd):
            执行cmd,读取数据

    class TxtStorage(DataStorageInterface):
        """
        文本存储
        """
        def write(self, cmd):
           这里cmd其实应该是数据


        def read(self, cmd):
        
    2019-12-05
    1
收起评论
91
返回
顶部