**单一原则:**就一个类而言,应该仅有一个引起它变化的原因。
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生的时候设计会遭到意想不到的破坏。
当然软件设计真正需要做的许多内容,就是发现职责并把那些职责相互分离。如果能多余一个的动机去改变一个类那么这个类就有多于一个的职责。
1.开放封闭原则
开放封闭原则:是说软件实体(类、模块、函数等等)应该可以扩展,但不可以修改(对于扩展时是开放的对于更改是关闭的)
无论模块是多么的封闭都会存在一些无法对之封闭的变化。既然不可以完全封闭,设计人员必须对设计的模块应该对哪种变化封闭做出选择。他必须先猜出最有可能发生变化种类,然后构造抽象来隔离那些变化。
开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是个好主意。拒绝不成熟地抽象和抽象本身一样重要。
依赖倒转原则: A.高层模块不应该依赖低层模块。两个都应该依赖抽象
B.抽象不应该依赖细节。细节应该依赖抽象。
在面向过程开发时,为了使得常用代码可以复用,一般都会把这些常用代码写成许许多多函数的程序库,这样我们在做新项目时,去调用这些低层的函数就可以了。比如我们做项目大多访问数据库,所以我们就把访问数据库的代码写成了函数,每次做新项目时就去调用这些函数。这也就叫做高层模块依赖低层模块。如果使用不同的数据库或存储信息方式这时就出现很麻烦了。我们希望能再次利用这些高层模块,但高层模块都是与低层的访问数据库绑在一起没办法复用这些高层模块。而如果高层模块和低层模块它们都依赖于抽象,具体一点就是接口或抽象类,只要接口是稳定的,那么任何一个的更改都不用担心其他受到影响。这就是无论高层还是低层都可以很容易的被复用。
里氏代换原则:子类型必须能够替换掉它们的父类型。
由于子类型的可替换性才使得使用父类类型得模块在无需修改得情况下就可以扩展。不然还谈什么扩展开放,修改关闭呢?依赖倒转原则,高层模块不应该依赖底层模块,两个都应该依赖抽象。除了依赖得接口或抽象不变其他得都可以灵活得使用