什么是面向对象的设计
“面向对象的设计”里面的“面向”是个形象的翻译,其实本意是“基于”对象的设计,是一种程序设计方法,这之前的程序设计方法是“基于”过程的,编程就是指定计算机运行的详细过程,有顺序、分支、循环三种基本机构。“基于”对象的程序设计颠覆了那个传统,程序设计者的人物是规定程序处理的各个对象的属性和方法,以及对象对事件的响应,设定好这些以后程序就完工了,然后交给系统和用户自行运作,结果可能有无限种可能。这样的程序设计方法,设计者设计时主要面对各类对象,所以叫做“面向对象的设计”。
面向对象设计原则有7个,这7大设计原则包括开闭原则、里氏替换原则、依赖倒转原则、单一职责原则、接口隔离原则、组合/聚合复用原则、迪米特法则。
面向对象设计7大原则,是初/中级Java工程师向高级/资深工程师进阶的一个必备技能,它可以大大提升程序的可复用性和可维护性,也是重构代码的一大利器。
面向对象设计简介
面向对象设计一般指OOD。面向对象设计(Object-OrientedDesign,OOD)方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受。
面向对象程序设计的三大特征是多态(Polymorphism)、继承(Inheritance)、封装(Encapsulation)。
1、多态
多态核心的思想就是,父类的引用能够指向子类的对象,或者接口类型的引用能够指向实现该接口的类的实例。多态会这样的原因是因为子类就是父类。
2、继承
Java是单继承的,这一点和C++有所不同,这也就意味着,一个类只能继承于一个类,被继承的类叫父类,或者是叫基类baseclass,继承的类叫子类。
Java当中的继承使用关键字extends。可是,一个类能够实现多个接口,多个接口之间用逗号进行分割。实现接口使用关键字implements。
3、封装(Encapsulation)
封装比较的简单,类包含了方法和数据,将方法和数据放在一个类当中,就构成了封装。封装的优点:将变化隔离,便于使用,提高重用性,提高安全性;封装的缺点:将变量等使用private修饰,或者封装进方法内,使其不能直接被访问,增加了访问步骤与难度!
面向对象程序设计的六大基本原则:
1、单一职责原则
不要存在多于一个导致类变更的原因,即一个类只承担一个职责。
2、开放-封闭原则
对扩展开放,对修改封闭。无论模块多么封闭,都会存在一些无法对之封闭的变化,既然不能完全封闭,我们必须对于自己设计的模块应该对哪种变化封闭做出选择,必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离这些变化。
3、迪米特原则
一个对象应该对其他对象有最少的了解,减少类与类之间的耦合。如果两个类不必彼此通信,那么这两个类就不应当发生直接的相互作用。类与类之间的耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及。
4、依赖倒转原则
上层模块不要依赖底层模块,它们都要依赖于抽象。抽象不能依赖于细节,细节要依赖于抽象。面向接口编程,不要面向实现编程。
5、里氏替换原则
子类型必须能够替换掉它们的父类型。只有当子类可以替换掉父类,软件单位的功能不受影响时,父类才能真正的被复用,而子类也能够在父类的基础上增加新的行为。
6、接口隔离原则
客户端不应该依赖于它不需要的接口,一个类对一个类的依赖应该建立在最小的接口上。不要让与自己无关的修改影响到自己功能模块的变化。
【回答】
面向对象程序设计有4个主要特点,分别是:抽象、封装、继承、多态。以下是具体解释;
一、抽象和封装
类和对象体现了抽象和封装
抽象就是解释类与对象之间关系的词。类与对象之间的关系就是抽象的关系。一句话来说明:类是对象的抽象,而对象则是类得特例,即类的具体表现形式。
封装两个方面的含义:一是将有关数据和操作代码封装在对象当中,形成一个基本单位,各个对象之间相对独立互不干扰。二是将对象中某些属性和操作私有化,已达到数据和操作信息隐蔽,有利于数据安全,防止无关人员修改。把一部分或全部属性和部分功能(函数)对外界屏蔽,就是从外界(类的大括号之外)看不到,不可知,这就是封装的意义。
二、继承
面向对象的继承是为了软件重用,简单理解就是代码复用,把重复使用的代码精简掉的一种手段。如何精简,当一个类中已经有了相应的属性和操作的代码,而另一个类当中也需要写重复的代码,那么就用继承方法,把前面的类当成父类,后面的类当成子类,子类继承父类,理所当然。就用一个关键字extends就完成了代码的复用。
三、多态
没有继承就没有多态,继承是多态的前提。虽然继承自同一父类,但是相应的操作却各不相同,这叫多态。由继承而产生的不同的派生类,其对象对同一消息会做出不同的响应。
【拓展回答】
一、面向对象程序设计概念
面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。
类当中有两个方面,一是封装属性,二是封装函数。在自己声明的类当中要既有属性又有函数,这就是类。
其实结构体的声明当中有很多不同数据类型的成员,在一个结构体当中,这就是对属性的封装,但是结构体与类相比较,还缺少了一个重要的环节,结构体当中只有属性,只封装了属性,但没有封装相应的操作,也就是没有封装操作成员属性的函数。
在结构体中声明一个结构体就相当于我们设计了一个类,定义一个结构体就相当于我们定义了一个对象,定义给两个结构体,相当于我们定义了两个对象。初始化结构体,相当于对象的初始化。
客观世界中任何一个事物都可以看成一个对象(Object),任何一个对象都有两个要素:一个是静态特征,这种静态特征称为属性。 一个是动态特征,这种动态特征称为行为(或功能)。
二、面向对象程序设计架构特点
面向对象设计方法以对象为基础,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换。这是面向对象设计方法最主要的特点和成就。面向对象设计方法的应用解决了传统结构化开发方法中客观世界描述工具与软件结构的不一致性问题,缩短了开发周期,解决了从分析和设计到软件模块结构之间多次转换映射的繁杂过程,是一种很有发展前途的系统开发方法。
但是同原型方法一样, 面向对象设计方法需要一定的软件基础支持才可以应用,另外在大型的MIS开发中如果不经自顶向下的整体划分,而是一开始就自底向上的采用面向对象设计方法开发系统,同样也会造成系统结构不合理、各部分关系失调等问题。所以面向对象设计方法和结构化方法仍是两种在系统开发领域相互依存的、不可替代的方法。
【参考资料】
百度百科——面向对象程序设计
面向对象程序设计的特点
问题:哪个类别要创建对象 A?
解决方案:一般而言,类别 B 若符合以下一个(也有可能是多个)条件,有权责要创建对象 A:
B 的实例包括 A 的实例,或是合成聚合 A 的实例
B 的实例会纪录 A 的实例
B 的实例密切的使用 A 的实例
B 的实例有 A 的实例初始化时的信息,在创建对象时会传递给 A 的实例[3]:16:16.7
相关模式或原则:低耦合性、工厂方法
控制器
控制器(controller)模式会将处理系统对象的职责指定给表现整个系统或是用例场景的非用户界面类别。控制器对象是非用户界面,负责接收或处理系统事件的对象。
问题:哪个对象要处理输入系统事件?
解决方案:应该由用例控制器来处理用例所有的系统事件,也可以用在一个以上的用例。例如“创建用户”或“删除用户”的用例,可以用同一个类别,称为 UserController,而不是用二个个别的用例控制器。
控制器定义为在用户界面之后,接收及处理系统动作的第一个对象。控制器需将需其他对象来完成的工作给对应对象。控制器协调或是控制相关活动。在信息系统逻辑架构的面向对象系统中,若应用程序在应用层/服务层和业务逻辑之间有明确的分隔,GRASP 控制器可以视为是应用层或是服务层的一部分。
相关模式或原则:命令模式、外观模式、层、纯虚构。
中介
中介(indirection)模式支持低耦合性,在二个对象之间将其职责指定到中介的对象,因此可以复用。其中一个例子是在模型—视图控制模式中,在资料(模型)和其实现(视图)之间导入控制器组件。这可以确保二个组件之间的低耦合性。
问题: 在二个或多个对象之间,要如何分配职责才能避免耦合?如何将对象解耦,才能支持低耦合度,且维持较高的复用潜力?
解决方案:将职责分配给二个或多个组件之间的中介对象或服务,让组件之间不会直接耦合
低耦合性
主条目:松耦合
耦合性是评估一组件链接另一组件,知道另一组件,或是依赖另一组件的程度。松耦合是为了以下的优点,指派职责的评估模式:
类别之间的相依性低
一个类别的修改对另一个类别的影响较小
复用潜力较高
高内聚性(high cohesion)
是设法让对象适当的具焦、可管理以及可理解的评估模式。高内聚性常常会用来支持低耦合性。高内聚性是指特定组件的多个职责是彼此紧密有关,高度具焦的。将程序分解为类别和子系统是增加系统内聚性的一种方式。相对的,低内聚性是指特定组件有太多不相关的职责。低内聚性的组件常会难以理解、复用、维护及改变。
多态
主条目:多态 (计算机科学)
依照多态(polymorphism)的原则,依类型变更行为的职责是在出现变更的类型上。这可以用多态运算符实现。这类类型的用户需要用多态运算符。
问题: 如何处理依类型的变化?如何产生可可插拔的软件组件?
解决方案:当一些行为会因为类型(类别)而变化,用多态运算符将此职责分派到类型出现变化的类型。(多态有许多的定义,在此处的定义是“在不同对象上的服务给予相同的名字”)
保护变化
参见:开闭原则
保护变化(protected variations)模式保护组件,不受其他组件(对象、系统、子系统)变化的影响,作法是将具焦在不稳定部分的程序包裹在接口内,利用多态来产生此一接口的不同实现。
问题: 如何设计对象、子系统和系统,让组件的变化或不稳定性不会对其他组件有不好的影响?
解决方案:识别预期到的变异或不稳定性,指定职责在其周围产生稳定的接口。
纯虚构
1、维护简单
面向对象程序设计的一个特征就是模块化。实体可以被表示为类以及同一名字空间中具有相同功能的类,可以在名字空间中添加一个类而不影响该名字空间的其他成员。这种特征为程序的维护提供了便捷性。
2、可扩充性
如果有一个具有某一种功能的类,就可以扩充这个类,创建一个具有扩充功能的类。
3、代码重用
功能是被封装在类中的,类是作为一个独立实体而存在的,因此可以很简单的提供类库,使代码得以重复使用。
扩展资料
面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。
一、面向对象程序设计学什么:
面向对象程序设计中学习主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。
二、知识扩展:面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。
任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。
1。什么是面向对象的分析?
面向对象的分析指的是分析要开发的系统的各个方面,从而找出类和对象(不是你想有什么对象就有什么对象的)。
2.什么是面向对象的设计?
是指我们设计出一些特殊的类(如:抽象类,目的:来表达系统中不同对象的共性)和机制(让系统的对象互相协作,提供系统的功能);
3.什么是面向对象的编程?
是指我们用特定的面向对象编程语言来实现我们的设计,实现我们发现的对象和类。
使用面向对象的困难在于找出系统的对象和类很困难,这常常需要经验、洞察力、严密的逻辑思维能力和创造力(这是最重要的),以及设计特殊的类和机制很困难。但是一旦做好了分析和设计,一切都变得极其简单。所以大多数人都会选择使用面向过程而不是用面向对象。
不要以为面向对象就是你的教材里讲的那些东西,面向对象还有许许多多的概念,而这些概念常常被忽略、吴用。
用面向对象设计你还要用学一样东西:UML(统一建模语言),这个语言在国人教材中没提到到(实际上没提到的东西多了)。
建议:去书店认认真真地找一本书国外的关于面向对象的书籍,这样你才能学到面向对象的精髓。
注我也不知道解释的明白不 反正我就是这样理解的。哈哈哈....