【架构师第二周】总结

用户头像
浪浪
关注
发布于: 2020 年 06 月 17 日

前言:面向对象编程区别于其它语言的本质是多态

一、框架设计

1、框架是实现某一类应用的结构性的程序,是对某一类架构方案可复用的设计与实现

  • 架构师要关注框架,要么自己实现,要么是自己选型,要把核心掌握在自己手中,让别人依赖你。

  • 框架是架构落地的保证。

2、框架和工具的区别:

  • 框架调别人,工具被调用

  • 例如:JUnit是框架,log4j是工具

二、面向对象设计的基本原则

1、关键词:强内聚,低耦合

带来的好处:易扩展、更强壮、可移植、更简单

否则,就会发出“臭味”:

  • 僵化性(无法扩展)

  • 脆弱性(牵一发动全身,很容易改错)

  • 牢固性(耦合太紧无法拆分)

  • 粘滞性(不好改,做错误的事比正确的事更容易)

2、OOD设计原则 SOLID

原则一:开闭原则(OCP Open/Close Principle)

对扩展开放,对修改关闭

  • 如何实现?通过多态,抽象

  • 穿插几个设计模式:策略模式、适配器模式、观察者模式

  • 任何时候,都要避免写if else,单独if是可以的,但是一旦else出现,就需要考虑用其它方式实现,比如策略模式。else出现一次,就可能出现n次

原则二:依赖倒置原则(DIP Dependency Inversion Principle)

  • 高层模块不依赖低层模块,而是依赖抽象

  • 抽象不能依赖实现,而是实现依赖抽象

  • 关键:不是我去调你,而是你来实现我,控制权在我。重点在于谁来定义接口

  • 高层定义接口,低层去实现,相当于controller层定义接口,service去实现

  • 框架的核心就是依赖倒置

  • 好莱坞规则:Don't call me, I'll call you,应用程序不要调用框架,框架会来调用应用

  • 下图描述了依赖倒置的发展



原则三:李氏替换原则(LSP)

是关于抽象的

  • 一句话总结:在程序中,子类必须能够替换基类,也就是说在使用基类的地方,必须也可以用子类替代,如果不能则违反了李氏替换原则。

  • 举例:父类是马,两个子类白马、黑马,都有共同的方法:骑马。但是如果子类是小马,那就违反了李氏替换原则。

  • 不符合is-a关系的继承,一定不符合LSP

  • 子类不能比父类更严格

  • 子类抛出的异常应该是父类抛出的异常的子类

  • 举例:正方形不能继承长方形,因为正方形更严格

如果继承违反LSP,可以变成组合,比如适配器模式

原则四:单一职责原则(SRP)

简单概括:一个类,只能有一个引起它变化的原因

强调的是,类不能太大,实现各种功能,职责不单一,粘滞性太强。

要有一个意识,一个类太大了,就需要想办法拆开,在拆分的时候,就能推动个人对于设计模式的理解。

原则五:接口分离原则(ISP)

ISP和SRP是相关的,都和内聚性有关,但是二者有一点矛盾,SRP强调拆开,但是ISP是说如果拆不开,就用接口隔离开,二者可以互相配合使用。

如果实现类分不开,但是类中的方法使用又不太一样,可以用多个接口拆分开,一个类实现多个接口,通过接口隔离开。

子类不应该实现自己不关心的方法,如何实现?

  1. 通过适配器实现

  2. 推荐通过多继承实现,即实现不同接口或继承



用户头像

浪浪

关注

还未添加个人签名 2020.04.28 加入

还未添加个人简介

评论

发布
暂无评论
【架构师第二周】总结