【架构师第二周】总结
前言:面向对象编程区别于其它语言的本质是多态
一、框架设计
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是说如果拆不开,就用接口隔离开,二者可以互相配合使用。
如果实现类分不开,但是类中的方法使用又不太一样,可以用多个接口拆分开,一个类实现多个接口,通过接口隔离开。
子类不应该实现自己不关心的方法,如何实现?
通过适配器实现
推荐通过多继承实现,即实现不同接口或继承
评论