面向对象设计七大原则
- 1、单一职责原则(Single Responsibility Principle 简称SRP)
- 2、开闭原则(Open Closed Principle 简称:OCP)
- 3、里氏替换原则(Liskov Substitution Principle 简称:LSP)
- 4、依赖倒转原则(Dependence Inversion Principle 简称:DIP)
- 5、接口分离原则(Interface Segregation Principle 简称:ISP)
- 6、迪米特原则(Law of Demeter 简称:LOD)
- 7、组合/聚合复用原则(Composite/Aggregate Reuse Principle 简称:CARP)
1、单一职责原则(Single Responsibility Principle 简称SRP)
概念: 每一个类应该专注于做一件事情,即只有一个职责,不要把过多的业务放在一个类中完成
核心思想: 解耦和增强内聚性(高内聚,低耦合)
理解: 类被修改的几率非常高,如果把多个功能放到一块,其中一个功能修改可能会影响到其他功能,保证类的职责单一,使其引起类变化的原因只有一个,通常我们是通过把
类拆分为最小的职能单位来实现的,保证类的职责单一,那么它组合与复用的时候就方便很多。如果一个类的职能过多,在组合复用的时候就会引入一些不必要的代码,从而造成代码污染
2、开闭原则(Open Closed Principle 简称:OCP)
概念: 面向扩展开放,面向修改关闭
核心思想: 对扩展开放,对修改关闭。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
理解: 在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放),即我们写代码的时候,需要考虑
当需求变化的时候,不是通过修改原来的代码来实现该需求,而是通过新增代码来完成需求。逆向思维理解下,如果当需求变化的时候,我们都需要修改原来的代码,存在很大
由于修改错误引起现有正常功能出错从而产生蝴蝶效应,相应的系统维护成本也增高,现在公司均重视维护成本,该原则有句潜台词:控制需求变动风险,缩小系统维护成本
3、里氏替换原则(Liskov Substitution Principle 简称:LSP)
概念: 超类存在的地方,子类是可以替换的
核心思想:
- 在任何父类出现的地方都可以用他的子类来替代,子类必须完全实现父类的方法。在类中调用其他类是务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。
- 子类可以有自己的个性。子类当然可以有自己的行为和外观了,也就是方法和属性
- 覆盖或实现父类的方ca法时输入参数可以被放大。即子类可以重载父类的方法,但输入参数应比父类方法中的大,这样在子类代替父类的时候,调用的仍然是父类的方法。
- 覆盖或实现父类的方法时输出结果可以被缩小。
理解: 子类能够替换父类出现在任何地方,这是在多态的前提下,本文所说的扩展灵活性,都是在不改变声明类型,而是通过改变声明类型的实例化对象来完成扩展及需求的 变更的。当然继承好像本身都满足这个条件,但是我们这里更注重的是继承的应用。
4、依赖倒转原则(Dependence Inversion Principle 简称:DIP)
概念: 实现尽量依赖抽象,不依赖具体实现
核心:
- 高层模块不应该依赖低层模块,两者都应该依赖其抽象(抽象类或接口)
- 抽象不应该依赖于细节(具体实现)
- 细节(具体实现)应该依赖抽象
实现方法
- 通过构造函数传递依赖抽象
- 通过setter传递依赖抽象
- 接口声明实现依赖抽象
理解: 理解依赖倒置原则之前我们先了解下传统的依赖,被调用者依赖调用者,即调用者决定了被调用者应该具有哪些方法,什么样的实现,在需求变更的时候,我们需要 付出很大的代价甚至推翻重做。依赖倒置要求调用者和被调用者都依赖抽象,两者之前没有具体的关联和接触,当一方变动时只用抽象不变动就不会影响另一方;依赖倒置的潜台词 面向抽象编程,解耦调用和被调用者
5、接口分离原则(Interface Segregation Principle 简称:ISP)
概念: 应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
核心: 不要使客户端依赖于他们不需要的方法,即一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口当中;
实现方法:
- 使用委托分离接口
- 使用多重继承分离接口
理解: 接口隔离原则可以说是单一职责的必要手段,它的含义就是尽量使用职责单一的接口,而不要使用复杂,全面的接口。接口是要子类实现的,接口职责单一,类也就 职责单一了,如果接口融合了多个不相关的方法,那它的子类就被迫要实现所有方法,尽管有些方法是根本用不到的。这就是接口污染。接口隔离原则的潜台词:拆分,从接口开始。
6、迪米特原则(Law of Demeter 简称:LOD)
概念: 又叫最少知识原则,一个类应当尽可能少的与其他实体发生相互作用
核心:
- 一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。(类间解耦,低耦合)意思就是降低各个对象之间的耦合,提高系统的可维护性;在模块之间只通过接口来通信, 而不理会模块的内部工作原理,可以使各个模块的耦合成都降到最低,促进软件的复用
实现方式:
- 在类的划分上,应该创建有弱耦合的类;
- 在类的结构设计上,每一个类都应当尽量降低成员的访问权限;
- 在类的设计上,只要有可能,一个类应当设计成不变;
- 在对其他类的引用上,一个对象对其它对象的引用应当降到最低;
- 尽量降低类的访问权限;
- 谨慎使用序列化功能;
- 不要暴露类成员,而应该提供相应的访问器(属性)
7、组合/聚合复用原则(Composite/Aggregate Reuse Principle 简称:CARP)
概念: 尽量使用合成/聚合达到复用,尽量少用继承。原则: 一个类中有另一个类的对象。
核心: 尽量使用对象组合,而不是继承来达到复用的目的。该原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些 对象的委派达到复用已有功能的目的。复用的种类:继承和合成聚合
理解: 如果只是为了代码的复用,尽量使用组合与聚合,而不是继承。组合聚合只是引用其他类的方法,而不会受到引用类的继承而改变血统。继承的耦合性比较大 ,比如一个父类后来添加实现了一个接口或者去掉一个接口,那么子类可能会遭到毁灭性的打击,但是如果使用组合聚合,只引用类的方法,就不会出现这种风险;组合的 潜台词: 我只用你的方法,我们不一定是同类;
- 上一篇 wget命令
- 下一篇 类和类,类和接口,接口和接口之间的关系