面向对象设计原则

原则一:单一功能原则

核心思想:解耦和增强内聚性(高内聚,低耦合)

原则二:开闭原则(OCP:Open Closed Principle)

核心思想:对扩展开放,对修改关闭。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。

我们写完的代码,不能因为需求变化就修改。我们可以通过新增代码的方式来解决变化的需求。我们要尽量的缩小这种修改。再解释一下这条原则的意义所在,我们采用逆向思维方式来想。如果每次需求变动都去修改原有的代码,那原有的代码就存在被修改错误的风险,当然这其中存在有意和无意的修改,都会导致原有正常运行的功能失效的风险,这样很有可能会展开可怕的蝴蝶效应,使维护工作剧增。说到底,开闭原则除了表面上的可扩展性强以外,在企业中更看重的是维护成本。所以,开闭原则是设计模式的第一大原则,它的潜台词是:控制需求变动风险,缩小维护成本。

原则三:里氏替换原则

核心思想:

1.在任何父类出现的地方都可以用他的子类来替代(子类应当可以替换父类并出现在父类能够出现的任何地方)子类必须完全实现父类的方法。在类中调用其他类是务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。

2.子类可以有自己的个性。子类当然可以有自己的行为和外观了,也就是方法和属性

3.覆盖或实现父类的方法时输入参数可以被放大。即子类可以重载父类的方法,但输入参数应比父类方法中的大,这样在子类代替父类的时候,调用的仍然是父类的方法。即以子类中方法的前置条件必须与超类中被覆盖的方法的前置条件相同或者更宽松。

4.覆盖或实现父类的方法时输出结果可以被缩小。

原则四:依赖倒转原则(DIP:Dependence Inversion Principle)

别名:依赖倒置原则或依赖反转原则

核心:要依赖于抽象,不要依赖于具体的实现

1.高层模块不应该依赖低层模块,两者都应该依赖其抽象(抽象类或接口)

2.抽象不应该依赖细节(具体实现)

3.细节(具体实现)应该依赖抽象。

三种实现方式:

1.通过构造函数传递依赖对象

2.通过setter方法传递依赖对象

3.接口声明实现依赖对象

原则五:接口分离原则(ISP:Interface Segregation Principle)

核心思想:不应该强迫客户程序依赖他们不需要使用的方法。

接口分离原则的意思就是:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口当中.

分离接口的两种实现方法:

1.使用委托分离接口。(Separation through Delegation)

2.使用多重继承分离接口。(Separation through Multiple Inheritance)

原则六:合成复用原则(CRP:Composite Reuse Principle)

核心思想:

尽量使用对象组合,而不是继承来达到复用的目的。该原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的。

复用的种类:

1.继承

2.合成聚合

组合聚合只是引用其他的类的方法,而不会受引用的类的继承而改变血统。 继承的耦合性更大,比如一个父类后来添加实现一个接口或者去掉一个接口,那子类可能会遭到毁灭性的编译错误,但如果只是组合聚合,只是引用类的方法,就不会有这种巨大的风险,同时也实现了复用。 组合聚合复用原则的潜台词是:我只是用你的方法,我们不一定是同类。

继承更注重的是“血统”,也就是什么类型的。而组合聚合更注重的是借用“技能”。并且,组合聚合中,两个类是部分与整体的关系,组合聚合可以由多个类的技能组成。在C#和Java中只有单继承。

原则七:迪米特原则(LOD:Law of Demeter)

又叫最少知识原则

核心思想:

一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。(类间解耦,低耦合)意思就是降低各个对象之间的耦合,提高系统的可维护性;在模块之间只通过接口来通信,而不理会模块的内部工作原理,可以使各个模块的耦合成都降到最低,促进软件的复用

注:

1.在类的划分上,应该创建有弱耦合的类;

2.在类的结构设计上,每一个类都应当尽量降低成员的访问权限;

3.在类的设计上,只要有可能,一个类应当设计成不变;

4.在对其他类的引用上,一个对象对其它对象的引用应当降到最低;

5.尽量降低类的访问权限;

6.谨慎使用序列化功能;

7.不要暴露类成员,而应该提供相应的访问器(属性) 

一个类如果暴露太多私用的方法和字段,会让调用者很茫然。并且会给类造成不必要的判断代码。所以,我们使用尽量低的访问修饰符,让外界不知道我们的内部。这也是面向对象的基本思路。这是迪米特原则的一个特性,无法了解类更多的私有信息。

你可能感兴趣的:(面向对象设计原则)