1、面向对象的特性html
三个基本的特性:封装、继承与多态。编程
一、封装
面向对象编程核心思想这一就是就是将数据和对数据的操做封装在一块儿.经过抽象,即从具体的实例中抽取共同的性质造成通常的概念,好比类的概念.网络
二、继承
继承体现了一种先进的编程模式.子类能够继承父类的属性和功能,即子类继承了父类所具备的数据和数据上的操做,同时又能够增添子类独有的数据和数据上的操做.例如,"人类"继承了"哺乳类"的属性和功能,同时又增添了人类独有的属性和功能.
三、多态
多态是面向对象编程的又一重要特征.有两种意义的多态(表现为方法的重写(Overriding)和重载(Overloading))
一种是操做名称的多态,即有多个操做具备相同的名字,但这些操做所接收的消息类型必须不一样.所谓操做名称的多态是指能够向操做传递不一样消息,以便让对象根据相应的消息来产生必定的行为.
2、七大基本原则
7大基本原则:单一职责原则SRP(Single Responsibility Principle)、开放封闭原则OCP(Open-Close Principle) 、替换原则、依赖原则(the Dependency Inversion Principle DIP) (the Liskov Substitution Principle LSP) 、接口分离原则(the Interface Segregation Principle ISP)、“迪米特”法则 、组合/聚合原则
一、单一职责原则SRP(Single Responsibility Principle)
一个类只负责一项职责
能够下降类的复杂度,一个类只负责一项职责,其逻辑确定要比负责多项职责简单的多;
提升类的可读性,提升系统的可维护性;
变动引发的风险下降,变动是必然的,若是单一职责原则遵照的好,当修改一个功能时,能够显著下降对其余功能的影响。
须要说明的一点是单一职责原则不仅是面向对象编程思想所特有的,只要是模块化的程序设计,都适用单一职责原则。
二、开放封闭原则OCP(Open-Close Principle)
对扩展开放,对修改封闭。
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。好比:一个网络模块,原来只服务端功能,而如今要加入客户端功能,
那么应当在不用修改服务端功能代码的前提下,就可以增长客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
三、里氏替换原则(the Liskov Substitution Principle LSP)
子类应当能够替换父类并出如今父类可以出现的任何地方。
里氏替换原则是1987年麻省理工学院一位姓里的女士提出的关于继承方面的原则:
子类必须确保父类的行为不被修改,即子类不能覆盖父类的非抽象方法。
只有这样才能确保子类可以替换父类的任何对象。通俗一点说就是 老鼠的儿子会打洞。
里氏替换原则是关于继承方面的原则,子类能够实现父类的抽象方法,不能覆盖非抽象方法;子类能够扩展本身的方法。该原则确保父类的行为不会改变,后续有对系统作者扩展时,可以保障系统的稳定性。
四、依赖倒转原则(the Dependency Inversion Principle DIP)
Robert Martin大师提出了面向对象设计原则----依赖倒置原则。依赖倒置原则(Dependence Inversion Principle,简称DIP)这个名字看着有点别扭,“依赖”还“倒置”,这究竟是什么意思?依赖倒置原则的原始定义是:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions。翻译过来,包含三层含义:模块化
- 高层模块不该该依赖低层模块,二者都应该依赖其抽象;
- 抽象不该该依赖细节;
- 细节应该依赖抽象。
高层模块和低层模块容易理解,每个逻辑的实现都是由原子逻辑组成的,不可分割的原子逻辑就是低层模块,原子逻辑的再组装就是高层模块。那什么是抽象,什么又是细节呢?抽象就是指接口或抽象类,二者都是不能直接被实例化的;细节就是实现类,实现接口或继承抽象类而产生的类就是细节,其特色就是能够直接被实例化,也就是能够加上一个关键字new产生一个对象。依赖倒置原则表现就是:spa
- 模块间的依赖是经过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是经过接口或抽象类产生的;
- 接口或抽象类不依赖于实现类;
- 实现类依赖接口或抽象类。
具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B须要使用到A的功能,
这个时候,B不该当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到
了 依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。经过上层模块难以免依赖下层模块,假如B也直接依赖A的实现,那么就可能造 成循环依赖。一个常见的问题就是编译A模块时须要直接包含到B模块的cpp文件,而编译B时一样要直接包含到A的cpp文件。
五、接口分离原则(the Interface Segregation Principle ISP)
模块间要经过抽象接口隔离开,而不是经过具体的类强耦合起来。即面向接口编程
六、“迪米特”法则
若是两个类没必要彼此直接通讯,那么这两个类就不该当发生直接的相互做用。若是其中一个类须要调用另外一类的某一个方法的话,能够经过第三者转发这个调用。
又叫最少知识原则,就是说,一个对象应当对其余对象有尽量少的了解
① 在类的划分上,应该建立有弱耦合的类;
② 在类的结构设计上,每个类都应当尽可能下降成员的访问权限;
③ 在类的设计上,只要有可能,一个类应当设计成不变类;
④ 在对其余类的引用上,一个对象对其它对象的引用应当降到最低;
⑤ 尽可能下降类的访问权限;
⑥ 谨慎使用序列化功能;
⑦ 不要暴露类成员,而应该提供相应的访问器(属性)。
七、组合/聚合原则
继承是一种强耦合的结构,父类变,子类就必需要变。“合成/聚合复用原则”:尽可能使用合成/聚合,尽可能不要使用类继承。它的好处是:优先使用对象的合成/聚合将有助于咱们保持每一个类被封装,并被集中在单个任务上。这样的类和类继承层次会保持较小规模,而且不太可能增加成为不可控制的庞然大物。
又叫合成复用原则。原则就是在一个新的对象里面经过关联关系(包括组合关系和聚合关系)使用一些已有的对象,使之成为新对象的一部分,新对象经过委派调用已有对象的方法达到复用其已有功能的目的。也就是,要尽可能使用类的合成复用,尽可能不要使用继承。
就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象经过向这些对象的委派达到复用已有功能的目的。这个原则有一个简短的描述:要尽可能使用合成、聚合,尽可能不要使用继承。.net
1) 新对象存取成分对象的惟一方法是经过成分对象的接口翻译
2) 这种复用是黑箱复用,由于成分对象的内部细节是新对象所看不到的设计
3) 这种复用能够在运行时间内动态进行,新对象能够动态的引用与成分对象类型相同的对象htm
4) 合成、聚合能够应用到任何环境中去,而继承只能应用到一些有限环境中去对象
5) 致使错误的使用合成、聚合与继承的一个常见缘由是错误的把“Has-a”关系看成“Is-a”关系。若是两个类是“Has-a”关系那么应使用合成、聚合,若是是“Is-a”关系那么可以使用继承
在面向对象设计中,能够经过两种基本方法在不一样的环境中复用已有的设计和实现,即经过组合/聚合关系或经过继承。
1) 继承复用:实现简单,易于扩展。破坏系统的封装性,从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(“白箱”复用 )
2) 组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操做;能够在运行时动态进行。(“黑箱”复用 )
组合/聚合可使系统更加灵活,类与类之间的耦合度下降,一个类的变化对其余类形成的影响相对较少,所以通常首选使用组合/聚合来实现复用;
其次才考虑继承,在使用继承时,须要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,下降复杂度,而滥用继承反而会增长系统构建和维护的难度以及系统的复杂度,所以须要慎重使用继承复用。
3、六大视点
复用(Reusibility)
扩展(Extensibility)
分离(Separability)
变化(Change)
简约(Simplicity)
一致(Coherance)迪米特法则:http://blog.csdn.net/yuluows/article/details/7082203依赖倒置原则:http://www.cnblogs.com/lzh_527/archive/2012/02/15/2352939.html