- 面向对象是什么
- 面向对象设计和面向对象编程的不同
- 面向对象设计的基本原则
- 基于统一建模语言并且当它不是一个麻烦的时候
面向对象
对象是一个数据以及相关行为的集合。面向对象指“功能上指向建模对象”,通过数据和行为来描述交互对象的集合,这是用于对复杂系统建模的众多技术之一。
事实上,分析、设计和编程是软件开发的整个过程。称他们是面向对象是简单指定了软件开发所追求的风格。
面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。
面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们我们使用的就是面向对象了。
面向过程:
优点:性能比面向对象好,因为类调用时需要实例化,开销比较大,比较消耗资源。
缺点:不易维护、不易复用、不易扩展.
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 .
缺点:性能比面向过程差
面向对象的三大特性:
1、封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
2、继承
提高代码复用性;继承是多态的前提。
3、多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
五大基本原则:
1、单一职责原则SRP(Single Responsibility Principle)
类的功能要单一,不能包罗万象,跟杂货铺似的。
2、开放封闭原则OCP(Open-Close Principle)
一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。
3、里式替换原则LSP(the Liskov Substitution Principle LSP)
子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。哈哈~~
4、依赖倒置原则DIP(the Dependency Inversion Principle DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。就是你出国要说你是中国人,而不能说你是哪个村子的。比如说中国人是抽象的,下面有具体的xx省,xx市,xx县。你要依赖的是抽象的中国人,而不是你是xx村的。
5、接口分离原则ISP(the Interface Segregation Principle ISP)
设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。
面向对象分析(OOA):着眼于一个问题、系统或任务的过程,分析阶段就是要将一个任务变成一套需求。最终把这个过程变成一个应用,并且识别这些对象以及对象间的交互。
面向对象设计(OOD):将需求转化为实践规范的过程,设计阶段就是关于事情应该如何做。需要命名这些对象、定义行为并且正式地指定这些对象可以作用于其他对象的具体行为。最终可以通过面向对象编程语言将需求转化成一套类和接口。
面向对象编程(OOP):把定义的设计转化成一个可以工作的程序的过程。
对象和类
一个对象是一个有着相应行为的数据的集合。类描述了对象,对象是类的实例。可以用统一建模语言类视图,来描述类与对象之间的关系。
指定属性和行为
对象是类的实例,可以彼此相互关联。一个对象实例是一个带有它自己数据集合和行为的特定对象。
数据描述对象
数据通常代表了一个给定对象的个体特征。对于这些特征每一个实例都可以给它们不同的值。属性通常称为特征。通常属性是可变的,特征是只读的。在Python中,“只读”的概念并没有真正使用。
行为是动作
行为是可以发生在对象身上的动作。一个特定的类的对象里可以执行的行为被称为方法。在编程层面,方法就像结构化编程里的函数一样,但是他们可以神奇地访问和这个对象关联的所有数据。方法会使用对象来执行任何他想要做的行为或者任务。返回值就是任务的结果。调用一个方法就是通过传给他所必须的参数来使这个方法执行的过程。
给单个对象添加模块或者方法允许我们创建一个交互对象的系统。系统里的每一个对象都是特定类的成员。这些类指明了这个对象可以容纳什么样的数据类型以及什么方法可以调用它。每一个对象的数据相比于同一类的其他对象可以有不同的状态,并且因为这个不同,每一个对象对于方法调用的反应也是不同的。
隐藏细节并且创建公共接口
在面向对象设计中模块化一个对象的主要目的是决定对象的公共接口。接口是其他对象可以和该对象交互的属性和方法的合集。
隐藏一个对象实现或者功能细节的过程,通常称为信息隐藏。也称为封装,但封装数据不一定是隐藏。
公共接口非常重要,改变接口会导致中断任意客户对象对他的调用。而利用公共接口可以使效率更高,客户对象无需改变就可以使用公共接口与之交互。而改变了公共访问的属性名字,那么所有客户对象也将必须修改。
抽象是另一个和封装以及信息隐藏相关的面向对象词汇。抽象就是通过把公共和私有接口分开而封装信息的过程。私有接口可以用于信息隐藏。
当分析一个系统的时候,在原始问题里对象通常代表名词,而方法通常代表动词,属性通常可以做为形容词。
组合和继承
组合是把一些对象收集在一起组成一个新对象。当一个对象是另一个对对象的一部分的时候,组合是一个好选择。聚合几乎和组合一样,不同的地方是,聚合对象可以独立存在。
继承
以上已经讨论了对象之间3种类型的关系:关联、组合和聚合。在面向对象编程中,一个类除了有继承特性和行为,也可以从其他类继承属性和方法。抽象类的概念,抽象类里可以声明一个抽象的方法,抽象方法会指示:我们在子类中需要这个方法,但是我们拒绝在这个类里指明一个实现方法。子类可以用更具体的实现来重写这个方法。
事实上,创建一个没有实现任何方法的类是可能的。这样一个类会简单的告诉我们这个类该做什么,但是绝对没有提供任何建议告诉你如何去做。在面向对象的世界里,这样的类称之为接口。
继承提供了抽象
多态是依据一个类的不同子类的实现而区别对待这个类的能力。
多重继承
面向对象设计允许一个子类从多个父类那里继承功能。只要两个父类有不同的接口,对于一个从这两个类继承过来的子类通常来讲是无害的。但如果我们从两个提供重叠接口的类继承就会出错。