面向对象和面向过程对比
- 格式:doc
- 大小:54.50 KB
- 文档页数:6
⾯向对象编程和⾯向过程编程的区别总结
今天我决定总结⼀下⾯向过程编程和⾯向对象编程的区别。
⼤学时学的是C语⾔,没有对象的概念,拿到功能设计图就直接写步骤将功能实现,⼀体化。
⽽现在⼯作⽤的是php语⾔,拿到需求,会归类、拆解模块、封装类,再通过类调⽤函数实现。
其实在早期,我受C语⾔影响,很难转变⾃⼰的⾯向过程思维,实现功能的逻辑虽然⽤的是php但是写出来的还是C逻辑,能减少⽤类定义就减少,甚⾄觉得类定义⿇烦,没必要。
当然,在我慢慢的接触类、对象这些的各种属性各种便利后,真⾹。
现在⽹络上有很多关于⾯向过程和⾯向对象区别的⽂档,都总结的很好,总结如下
1、⾯向过程在解决问题的时候,会分析出解决问题的步骤,然后⽤函数⼀步步的将这些步骤实现,依次调⽤函数。
⽽⾯向对象在解决问题的时候,会将问题拆散成⼀个个对象,建⽴对象的⽬的不是为了完成某个步骤,⽽是为了描述某个事物在整个解决问题的步骤中的⾏为。
这来⾃于思考问题⽅式的不同。
2、从结构上说,⾯向过程的特点是过程化和模块化,⽽⾯向对象的特点则是类封装、继承和多态(多态:同⼀操作作⽤于不同的对象,可以有不同的解释,产⽣不同的执⾏结果。
在运⾏时,可以通过指向基类的指针,来调⽤实现派⽣类中的⽅法)。
3、执⾏效率不同,⾯向过程不需要封装类再实例化对象调⽤,只定义了函数和调⽤,所以执⾏效率会更⾼⼀些。
总的来说,⾯向过程执⾏效率更⾼也更直接,⾯向过程更灵活也更丰满。
编程语言中的面向过程与面向对象在计算机科学领域,编程语言是程序员与计算机进行交流的工具。
不同的编程语言有不同的特点和应用场景,其中最常见的两种编程范式是面向过程和面向对象。
一、面向过程编程面向过程编程是一种以过程为中心的编程范式。
在面向过程编程中,程序被分解为一系列的过程或函数,每个过程都是一系列指令的集合,用于完成特定的任务。
这些过程按照顺序执行,通过传递参数和返回值来进行数据交互。
面向过程编程的主要优点是简单直观,易于理解和实现。
它适用于解决一些简单的问题,特别是那些只需要顺序执行一系列指令的任务。
然而,面向过程编程的缺点是随着程序规模的增大,代码变得难以维护和扩展。
由于缺乏封装和抽象的机制,代码的复用性和可重用性较差。
二、面向对象编程面向对象编程是一种以对象为中心的编程范式。
在面向对象编程中,程序由一组相互协作的对象组成,每个对象都有自己的状态和行为。
对象之间通过消息传递进行通信,对象可以根据接收到的消息来改变自己的状态和执行相应的行为。
面向对象编程的主要优点是提供了更高层次的抽象和封装,使得程序更易于理解、维护和扩展。
通过将数据和操作封装在对象中,面向对象编程可以实现代码的复用和模块化,提高了软件开发的效率和质量。
此外,面向对象编程还支持继承和多态等特性,使得代码具有更大的灵活性和可扩展性。
三、面向过程与面向对象的比较面向过程和面向对象是两种不同的编程思想和范式,它们各有优劣。
面向过程编程更加直观和简单,适用于解决一些简单的问题。
然而,面向过程编程的可维护性和可扩展性较差,对于大型复杂的软件系统来说,往往难以应对。
相比之下,面向对象编程更加灵活和可扩展,适用于开发大型复杂的软件系统。
面向对象编程通过封装、继承和多态等机制,提供了更高层次的抽象和封装,使得代码更易于理解、维护和扩展。
然而,面向对象编程的学习曲线较陡,需要掌握一些额外的概念和技术。
四、选择合适的编程范式在选择编程范式时,需要根据具体的问题和需求来决定。
面向对象与面向过程程序设计方法的比较摘要:区别于一般讲述面向对象技术的文章,本文系统地比较了面向对象技术和面向过程技术的异同,并着重介绍面向对象技术以及它的封装、继承和多态三个特点,让读者对面向对象有一个形象的理解。
然后通过比较和举例,文章分析了OO技术在软件工程中的三大优势。
Abstract:Being different from general articles about object-oriented technology ,this paper systematically compared the object-oriented technology and the process-oriented technology, and mainly introduces the object-oriented technology and its three characteristics :packaging, inheritance and polymorphism, to make the reader have an image of understanding of object-oriented. Then through the comparison and some examples, this paper analyzes the OO based software engineering in three points.关键字:面向对象面向过程软件工程Key words:Object-Oriented Process-Oriented Software-Engineering一引言20世纪60年代中期开始爆发的软件危机,使人们认识到大中型软件系统与小型软件系统的本质区别,软件工程以及面向对象编程(Object-Oriented Programming)技术得以应运而生。
面向对象和面向过程的本质区别面向对象(Object-oriented Programming,简称OOP)与面向过程(Procedure-oriented Programming,简称POP)是两种不同的编程范式,其本质区别主要体现在程序组织、设计思想和代码编写方式上。
1.程序组织方式:面向对象:程序被组织成对象的集合,每个对象拥有自己的属性和方法,并通过交互来完成任务。
对象将数据和操作封装在一起,形成一个独立的实体。
对象之间通过消息传递进行通信。
面向过程:程序被组织成一系列的过程或函数,每个过程执行特定的任务。
数据和操作是分离的,数据作为参数传递给过程,并返回处理后的结果。
2.设计思想:面向对象:强调的是对现实世界的建模,将问题的解决方案看作对象之间的协作。
通过将系统拆分成多个对象,每个对象负责完成特定的功能,并通过封装、继承、多态等机制来实现高内聚、低耦合的设计。
面向过程:以解决问题的步骤为中心,强调过程和函数的设计。
按任务顺序编写一系列步骤,通过数据传递和操作来解决问题。
设计上较为简单直接,适合小型程序。
3.抽象程度:面向对象:可以理解为一种更高层次的抽象。
通过将现实世界的实体抽象为对象,并定义对象之间的关系和行为,从而实现对问题的模拟和建模。
面向过程:着重于任务的具体实现步骤,在程序中以函数或过程的形式直接体现出来。
4.代码编写方式:面向对象:重点在于对象之间的交互和协作。
代码主要由类、对象、方法和消息等组成。
通过类的定义来创建对象,调用对象的方法来实现具体功能,实现了代码的重用性。
面向过程:代码主要由函数、变量和控制流程语句等组成。
强调算法和步骤,代码的编写比较直接,相对简单。
5.扩展性和维护性:面向对象:封装、继承和多态的机制使得代码易于扩展和维护。
对系统的修改和扩展只需添加新的类或修改现有类的方法,不会影响到其他部分的代码。
通过继承和多态可以实现代码的重用和灵活性。
面向过程:代码的耦合性较高,修改和扩展可能需要改动多个函数,会导致代码的脆弱性和维护困难。
面向对象的概念是什么?和面向过程有什么区别?面向对象是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程。
面向过程,也就是结构化程序设计是一种自顶向下逐步求精的设计方法,和单入口单出口的程序结构。
面向对象的概念,特点是什么?1.编程模型所有计算机均由两种元素组成:代码和数据.精确的说,有些程序是围绕着"什么正在发生"而编写,有些则是围绕"谁正在受影响"而编写的.第一种编程方式叫做"面向过程的模型",按这种模型编写的程序以一系列的线性步骤(代码)为特征,可被理解为作用于数据的代码.如C 等过程化语言.第二种编程方式叫做"面向对象的模型",按这种模型编写的程序围绕着程序的数据(对象)和针对该对象而严格定义的接口来组织程序,它的特点是数据控制代码的访问.通过把控制权转移到数据上,面向对象的模型在组织方式上有:抽象,封装,继承和多态的好处.2.抽象面向对象程序设计的基本要素是抽象,程序员通过抽象来管理复杂性.管理抽象的有效方法是使用层次式的分类特性,这种方法允许用户根据物理含义分解一个复杂的系统,把它划分成更容易管理的块.例如,一个计算机系统是一个独立的对象.而在计算机系统内部由几个子系统组成:显示器,键盘,硬盘驱动器,DVD-ROM,软盘,音响等,这些子系统每个又由专门的部件组成.关键是需要使用层次抽象来管理计算机系统(或其他任何复杂系统)的复杂性.面向对象程序设计的本质:这些抽象的对象可以被看作具体的实体,这些实体对用来告诉我们作什么的消息进行响应./* (我的理解)*计算机是一个实体,我要输入字符,显示器显示出来,那么*计算机(对象).输入(键盘属性).显示(显示方法)*使用分层来引用,操作.而不用管计算机内部如何处理.*只要有计算机对象,它就能响应我的操作,而我敲键盘,*计算机对象就把这个消息传给屏幕,屏幕显示.*/计算机对象包含了它所有的属性,以及操作,这就是面向对象程序设计的三大原则之一:封装.3.封装封装是一种把代码和代码所操作的数据捆绑在一起,使这两者不受外界干扰和误用的机制.封装可被理解为一种用做保护的包装器,以防止代码和数据被包装器外部所定义的其他代码任意访问.对包装器内部代码与数据的访问通过一个明确定义的接口来控制.封装代码的好处是每个人都知道怎样访问代码,进而无需考虑实现细节就能直接使用它,同时不用担心不可预料的副作用.在JAVA中,最基本的封装单元是类,一个类定义着将由一组对象所共享的行为(数据和代码).一个类的每个对象均包含它所定义的结构与行为,这些对象就好象是一个模子铸造出来的.所以对象也叫做类的实例.在定义一个类时,需要指定构成该类的代码与数据.特别是,类所定义的对象叫做成员变量或实例变量.操作数据的代码叫做成员方法.方法定义怎样使用成员变量,这意味着类的行为和接口要由操作实例数据的方法来定义.由于类的用途是封装复杂性,所以类的内部有隐藏实现复杂性的机制.所以JA VA中提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西.私有的方法数据只能通过该类的成员代码来访问.这就可以确保不会发生不希望的事情.4.继承继承是指一个对象从另一个对象中获得属性的过程.是面向对象程序设计的三大原则之二,它支持按层次分类的概念.例如,波斯猫是猫的一种,猫又是哺乳动物的一种,哺乳动物又是动物的一种.如果不使用层次的概念,每个对象需要明确定义各自的全部特征.通过层次分类方式,一个对象只需要在它的类中定义是它成为唯一的各个属性,然后从父类中继承它的通用属性.因此,正是由于继承机制,才使得一个对象可以成为一个通用类的一个特定实例.一个深度继承的子类将继承它在类层次中的每个祖先的所有属性.继承与封装可以互相作用.如果一个给定的类封装了某些属性,它的任何子类将会含有同样得属性,另加各个子类所有得属性.这是面向对象程序在复杂性上呈线性而非几何增长的一个重要概念.新的子类继承其所有祖先的所有属性.子类和系统中的其他代码不会产生无法预料的交互作用.5.多态多态是指一个方法只能有一个名称,但可以有许多形态,也就是程序中可以定义多个同名的方法,用"一个接口,多个方法"来描述.可以通过方法的参数和类型引用.6.封装,继承,多态的组合使用在由封装,继承,多态所组成的环境中,程序员可以编写出比面向过程模型更健壮,更具扩展性的程序.经过仔细设计的类层次结构是重用代码的基础.封装能让程序员不必修改公有接口的代码即可实现程序的移植.多态能使程序员开发出简洁,易懂,易修改的代码.例如:汽车从继承的角度看,驾驶员都依靠继承性来驾驶不同类型(子类)的汽车,无论这辆车是轿车还是卡车,是奔驰牌还是菲亚特牌,驾驶员都能找到方向盘,手刹,换档器.经过一段时间驾驶后,都能知道手动档与自动档之间的差别,因为他们实际上都知道这两者的共同超类:传动装置.从封装的角度看,驾驶员总是看到封装好的特性.刹车隐藏了许多复杂性,其外观如此简单,用脚就能操作它.发动机,手刹,轮胎大小的实现对与刹车类的定义没有影响.从多态的角度看,刹车系统有正锁反锁之分,驾驶员只用脚踩刹车停车,同样的接口可以用来控制若干种不同的实现(正锁或反锁).这样各个独立的构件才被转换为汽车这个对象的.同样,通过使用面向对象的设计原则,程序员可以把一个复杂程序的各个构件组合在一起,形成一个一致,健壮,可维护的程序类是对象的抽象,实例是类的实现C++中对象和类有何联系和区别:它的区别就像int a = 0;中的int 和a 的区别一样。
今天聊⼀下:什么是⾯向对象?⾯向过程?举例⼦以及:⾯向过程和⾯向对象的优缺点,让你⾯试的时。
⼀、⾯向过程:⾯向过程就是分析出实现需求所需要的步骤,通过函数⼀步⼀步实现这些步骤,接着依次调⽤即可。
⼆、⾯向对象:将数据与函数绑定到⼀起,进⾏封装,这样能够更快速的开发程序,减少了重复代码的重写过程。
1、⾯向对象是⼀种编程风格,⼀切皆对象,把⼀切东西看成是⼀个个对象,⽐如⼈、⽿机、⿏标、⽔杯等,他们各⾃都有属性,⽐如:⽿机是⽩⾊的,⿏标是⿊⾊的,⽔杯是圆柱形的等等,把这些对象拥有的属性变量和操作这些属性变量的函数打包成⼀个类来表⽰2、⾯向对象有三⼤特性:封装,继承,多态。
---- 封装:将⼀类事物的属性和⾏为抽象成⼀个类,使其属性私有化,⾏为公开化,提⾼了数据的隐秘性的同时,使代码模块化。
这样做使得代码的复⽤性更⾼。
意义:将属性和⽅法放到⼀起做为⼀个整体,然后通过实例化对象来处理;隐藏内部实现细节,只需要和对象及其属性和⽅法交互就可以了;对类的属性和⽅法增加访问权限控制。
---- 继承:在程序中,继承描述的是多个类之间的所属关系,如果⼀个类A⾥⾯的属性和⽅法可以复⽤,则可以通过继承的⽅式,传递到类B ⾥,那么类A就是基类,也叫做⽗类;类B就是派⽣类,也叫做⼦类。
继承进⼀步提⾼了代码的复⽤性。
---- 多态:所谓多态:定义时的类型和运⾏时的类型不⼀样,此时就成为多态,多态的概念是应⽤于Java和C#这⼀类强类型语⾔中。
:举例⼦第⼀种⽅式(⾯向过程)1、养鸭⼦2、鸭⼦长成3‘、杀4、作料5、烹饪6、吃7、卒第⼆种⽅式(⾯向对象):1、找个卖啤酒鸭的⼈2、给钱交易3、吃4、胖6⽄⾯向过程和⾯向对象的优缺点:⾯向过程优点:性能上它是优于⾯向对象的,因为类在调⽤的时候需要实例化,开销过⼤。
缺点:不易维护、复⽤、扩展⽤途:单⽚机、嵌⼊式开发、Linux/Unix等对性能要求较⾼的地⽅⾯向对象优点:易维护、易复⽤、易扩展,由于⾯向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
面向过程、面向对象、面向组件、面向服务软件架构的分析与比较摘要:软件开发从汇编语言、过程式语言、面向对象、面向组件发展到面向服务,每一步都表达了不断抽象、更加贴近业务实际的发展趋势。
当前软件发展正处于从面向组件思想向面向服务思想的跨越阶段。
本文深入分析了面向过程、面向对象、面向组件、面向服务架构,得出相关的优缺点。
关键字:面向过程,面向对象,面向组件,面向服务1 背景当前,信息系统的发展越来越明显地呈现出以下特征:软件系统越来越庞大,但是软件系统内部组成模块的规模却越来越小;软件系统的功能越来越复杂,但是系统的开放性却越来越好。
信息系统软件正向着不依赖于特定的硬件和操作系统以及具有高度可重用性的方向发展。
在这种情况下,人们对这种大型复杂软件产品的质量和开发速度都有了更严格的要求,传统的开发方法已经难以满足这种需求。
首先,我们来分析一下几种传统的系统开发方法。
1〕自底向上法自底向上法出现于早期的电脑管理应用系统,即在进行系统分析和设计时自下而上,先从底层模块做起,然后逐步完成整个系统。
自底向上法使得系统的开发易于适应组织机构真正的需要;有助于发现系统的增长需要,所获得的经验有助于下一阶段的开发,易于控制和管理。
但由于方法的演变性质,自底向上法使系统难以实现其整体性;同时由于系统未进行全局规划,数据一致性和完整性难以保证;而且为了保证系统性能的需求,往往要重新调整,甚至重新设计系统。
2〕自顶向下法随着信息系统规划的扩大和对开发经验的总结与归纳,自顶向下的系统分析方法论逐步得到了发展和完善。
自顶向下法要求开发者首先制定系统的总体规划,然后逐步别离出高度结构化的子系统,从上至下实现整个系统。
运用这类方法可以为企业或机构MIS的中期或长期发展规划奠定基础,同时支持信息系统的整体性,为系统的总体规划、子系统的协调和通信提供保证。
但它同样也存在缺点:对系统分析、设计人员要求较高,在大系统中,对下层系统的实施往往缺乏约束力,开发的周期长,系统复杂,成本较高。
Python之⾯向过程和⾯向对象的区别⼀、⾯向过程 1、⾯向过程:核⼼是过程⼆字,过程指的是解决问题的步骤,好⽐如设计⼀条流⽔线,是⼀种机械式的思维⽅式。
就是程序从上到下⼀步步执⾏,⼀步步从上到下,从头到尾的解决问题。
基本设计思路就是程序⼀开始是要着⼿解决⼀个⼤的问题,然后把⼀个⼤问题分解成很多个⼩问题或⼦过程,这些⼦过程再执⾏的过程再继续分解直到⼩问题⾜够简单到可以在⼀个⼩步骤范围内解决。
2、优缺点: 优点:将复杂的问题流程化,进⽽简单化。
缺点:扩展性差 3、实例:⾯向过程式的登录注册程序 import json,redef login():'''⽤户输⼊:return:'''usename = input('⽤户名:').strip()pwd = input('密码:').strip()tel = input('电话:').strip()mail = input('邮箱:').strip()return {'usename':usename,'pwd':pwd,'tel':tel,'mail':mail}def authentication(use_info):'''判断⽤户名和密码等信息是否合法:return:'''is_valid = True # 默认合法if len(use_info['usename'])==0:print('⽤户名不能为空!')is_valid = Falseif len(use_info['pwd'])< 6:print('密码长度不得⼩于6位!')is_valid = Falseif len(re.findall('1[0-9]{10}',use_info['tel']))==0:print('电话格式不对!')is_valid = Falseif not re.search(r'@.*?.com$',use_info['mail']).group(): # 使⽤Python的r前缀,就不⽤考虑转义的问题,'*'加个?就可以让'.'采⽤⾮贪婪匹配print('邮箱格式不对')is_valid = Falsereturn {'valid':is_valid,'info':use_info}def register(auth):'''若输⼊信息合法则注册,写⼊⽂件或数据库:param auth::return:'''if auth['valid']==True:with open('data.json','w',encoding='utf-8') as f:json.dump(auth['info'],f)def main():'''主逻辑程序:return:'''use_info = login()auth = authentication(use_info)register(auth)if__name__=='__main__': # 直接调⽤时执⾏下列程序,被调⽤时不执⾏main()View Code 注意:⼀般认为,如果你只是写⼀些简单的脚本,去做⼀些⼀次性任务,⽤⾯向过程的⽅式是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护的,那还是⽤⾯向对象最⽅便。
Q:面对对象和面向过程的优缺点,结合实例进行阐述A:一、个人理解,面向对象相对于面向过程较显著的优势莫过于可扩展性、可维护性。
众所周知在软件开发过程中,开发人员与客户需要不断的沟通,而客户的需求也往往在不断的变化,软件的功能也不是一成不变的。
如果采用面向过程的方法来进行软件开发,当用户需求发生变化时,比如要求修改现有软件功能的实现方式或者要求追加新的功能时,就需要自顶向下地修改模块的结构,有时候甚至整个软件系统的设计被完全推翻。
相比之下,面向对象所提供的可扩展性保证了当软件必须增加新的功能时,能够在现有系统结构的基础上,方便的创建新的子系统,而不需要改变软件系统现有的结构,也不会影响已经存在的子系统。
可维护性则保证了当用户需求发生变化时,只需要修改局部的子系统的少量程序代码,而不会牵一发动全身。
举一个例子,暴雪公司开发的魔兽争霸游戏,这个游戏里面有很多人物角色,例如我们要编程实现美杜莎这个角色的技能攻击动作。
如果使用面向过程的方法来实现。
本例使用C++,Visual C++ 6.0环境下调试。
#include<iostream>using namespace std;#define SPLIT_SHOT 1#define MYSTIC_SNAKE 2#define MANA_SHIELD 3void useSplitShot() //使用分裂箭技能{cout<<"Split Shot"<<endl;}void useMysticSnake() //使用秘术异蛇技能{cout<<"Mystic Snake"<<endl;}void useManaShield() //使用魔法护盾技能{cout<<"Mana Shield"<<endl;}void useSkill() //使用技能{int skill;cin>>skill; //输入技能快捷键switch(skill){case SPLIT_SHOT:useSplitShot();break;case MYSTIC_SNAKE:useMysticSnake();break;case MANA_SHIELD:useManaShield();break;default:cout<<"无法使用技能"<<endl;break;}}int main(){useSkill();return 0;}假如有一天玩家向暴雪反映,美杜莎这个英雄的技能太少啦,我们希望再增加一个技能。
这个时候假如暴雪决定增加一个石化凝视(Stone Gaze)技能,那么需要进行以下三步:(1) 在整个系统范围内,增加一个常量:#define STONE_GAZE 4(2) 在整个系统范围内增加一个新的石化凝视技能模块:void useStoneGaze() //使用石化凝视技能{cout<<"Stone Gaze"<<endl;}(3) 在使用技能模块useSkill()内增加以下逻辑:case STONE_GAZE:useStoneGaze();break;由此可见,面向过程的开发方法制约了软件的可维护和可扩展性,模块之间的松耦合性不高,修改或增加一个模块会影响到其他的模块。
如果采用面向对象的方式,则该功能可以这样实现。
本例使用Java,MyEclipse环境下调试。
Skill.javapublic interface Skill //技能接口{void useSkill(); //使用技能}SplitShot.javapublic class SplitShot implements Skill //分裂箭技能类{public void useSkill(){System.out.println("Split Shot"); //使用分裂箭技能}}MysticSnake.javapublic class MysticSnake implements Skill //秘术异蛇技能类{public void useSkill(){System.out.println("Mystic Snake"); //使用秘术异蛇技能}}ManaShield.javapublic class ManaShield implements Skill //魔法护盾技能类{public void useSkill(){System.out.println("Mana Shield"); //使用魔法护盾技能}}SkillFactory.javaimport java.util.HashMap;import java.util.Map;public class SkillFactory //技能工厂类{public static final int SPLIT_SHOT = 1;public static final int MYSTIC_SNAKE = 2;public static final int MANA_SHIELD = 3;private static Map<Integer, String> skills = new HashMap<Integer, String>();static{skills.put(new Integer(SPLIT_SHOT), "SplitShot");skills.put(new Integer(MYSTIC_SNAKE), "MysticSnake");skills.put(new Integer(MANA_SHIELD), "ManaShield");}public static Skill getSkill(int key){try{String className = skills.get(new Integer(key));return (Skill)Class.forName(className).newInstance();}catch(Exception e){e.printStackTrace();return null;}}}Medusa.javaimport java.io.BufferedReader;import java.io.InputStreamReader;public class Medusa //角色类——美杜莎{public void useSkill() throws Exception //实现美杜莎释放技能的方法{BufferedReader input = new BufferedReader(new InputStreamReader(System.in));int key = Integer.parseInt(input.readLine()); //输入技能快捷键Skill skill = SkillFactory.getSkill(key);if(skill==null){System.out.println("无法使用技能");}else{eSkill();}}public static void main(String[] args) throws Exception{new Medusa().useSkill(); //美杜莎释放技能}}假设同样的情况,暴雪公司需要给美杜莎增加一个新的技能——石化凝视(Stone Gaze),那么只需要对该系统做如下修改:(1) 增加一个石化凝视技能类StoneGazepublic class StoneGaze implements Skill //石化凝视技能类{public void useSkill(){System.out.println("Stone Gaze"); //使用石化凝视技能}}(2) 在SkillFactory类中增加一个STONE_GAZE常量,并修改静态代码块。
修改过的代码如下:public static final int SPLIT_SHOT = 1;public static final int MYSTIC_SNAKE = 2;public static final int MANA_SHIELD = 3;public static final int STONE_GAZE = 4;private static Map<Integer, String> skills = new HashMap<Integer, String>();static{skills.put(new Integer(SPLIT_SHOT), "SplitShot");skills.put(new Integer(MYSTIC_SNAKE), "MysticSnake");skills.put(new Integer(MANA_SHIELD), "ManaShield");skills.put(new Integer(STONE_GAZE), "StoneGaze");}由此可见,当Medusa系统增加技能时,仅仅修改了Skill子系统,对Medusa子系统并没有任何影响。
此外,Skill子系统具有良好的可扩展性,当Skill子系统需要增加新的技能时,无须修改Skill子系统的系统结构,只需要创建新的技能实现类即可。
上面的例子比较简单,所以面向对象的易扩展易维护的优势体现的不太明显,但是如果随着客户提出的问题域复杂度的增加,修改面向过程软件的难度会以几何倍数增长,甚至会导致整个系统不得不推翻重做。
二、除了可扩展性和可维护性外,面向对象还具有可重用性,从而可以减少软件中的重复代码,避免重复编程。
三、面向对象中提出的对象概念更贴近现实,符合自然世界的规律,程序设计本来就是对现实世界的模拟,使用面向对象就能很自然的模拟出问题域。
四、对一个团队来说,使用面向对象思想编程,可以很容易的把项目的具体工作分离,分工合作,同时开发,从而降低了开发成本,提高了开发效率。
五、在面向过程程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问。
这种结构很容易造成全局数据在无意中被其他函数改动,因而程序的正确性不易保证。