OOP 面向对象编程_第1页
OOP 面向对象编程_第2页
OOP 面向对象编程_第3页
OOP 面向对象编程_第4页
OOP 面向对象编程_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、OOPAIA什么是什么是面向对象面向对象?Object Oriendted Programming对象 以为导向的 程序设计面向对象就是使用对象进行程序设计,简写成OOP面向过程 (SP)面向对象(OOP)设计思路自顶向下、层次化、分解自底向上、对象化、综合程序单元函数模块对象设计方法程序 = 算法 + 数据结构程序 = 对象 = 数据 + 方法优点相互独立,代码共享接近人的思维方式模拟客观世界缺点数据与程序不一致维护困难客观世界的无序性概念不成熟SP和和OOP对比对比一个示例示例场景:我们需要设计一个人事管理系统,其中的一个功能是对各种不同类型的员工,计算其当月的工资不同类型的员工,拥有不同

2、的薪金计算制度。结构化做法结构化做法1.获得人事系统中所有可能的员工类型2.根据不同的员工类型所对应的不同的薪金制度,计算其工资enum EmployeeTypeEngineer;Sales;Manager;/ 计算工资程序if ( type = EmployeeType.Engineer)else if (type = Employeetype.Sales)面向对象设计1.根据不同的员工类型设计不同的类,并使这些类继承自一个Employee抽象类,其中有一个抽象方法GetSalary。2.在各个不同的员工类中,根据自己的薪金制度,重写(override)GetSalary方法。abstrac

3、t class Employeepublic abstract int GetSalary();class Engineer: Employee public override int GetSalary()class Sales: Employeepublic override int GetSalary()/ 显示工资程序Employee e = emFactory.GetEmployee(id);MessageBox.Show( e.GetSalary();示例场景:现在需求改变了随着客户公司业务规模的拓展,又出现了更多类型的员工,比如钟点工、计件工等等,这对人事管理系统提出了挑战原有的

4、程序必须改变。结构化做法几乎所有涉及到员工类型的地方(当然包括“计算工资程序”)都需要做改变这些代码都需要重新编译,重新部署.面向对象做法只需要在新的文件里增添新的员工类,让其继承自Employee抽象类,并重写GetSalary()方法,然后在 EmployeeFactory.GetEmployee方法中根据相关条件,产生新的员工类型就可以了。其他地方(显示工资程序、Engineer类、 Sales类等)则不需要做任何改变。重新认识面向对象对于前面的例子,从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小。对象对象对象是面向对象编程的核心部分,是实际存在的具体

5、实体,具有明确定义的状态和行为;对象其实就是“数据”和“函数”的封装体,其中:数据表示自身的状态,也称作“属性”或“成员数据”;函数表示自身的功能,也称作“方法”或“成员函数”。类类人们为了更好地认识世界,将现实生活中的事物(对象)划分成类;同一类中的事物总是具有一些共性。类和对象类和对象的的关系关系类是用来描述实体的“模板”或“原型”;对象是实际的实体,每一个对象都是类的一个具体实例。Java OOP三大思想封装继承多态封装隐藏实现细节,对外提供公共的访问接口,增强代码的可维护性具体实现方式:属性私有化、添加公有的setter,getter方法继承多态增强代码的可扩展性、维护性同一个实现接口

6、,使用不同的实例而执行不同操作。通过Java接口/继承来定义统一的实现接口;通过方法重写为不同的实现类/子类来定义不同的操作静态的多态就是只函数的重载,动态的多态就是方法的覆写原则:“左声明右实现” 这个原则可以在任何地方使用,包括在接口和抽象类中,软件初学者可以以这个原则来理解面向父类的编程方法。父类/*坦克类,它是所有坦克的父类*/class Tank public void printTank() System.out.println(This is Tank); /*M1坦克类,它继承了坦克父类*/class M1Tank extends Tank /该方法重写了父类中的printTa

7、nk public void printTank() System.out.println(This is M1Tank); /M1Tank自己的方法 public void showName() System.out.println(M1Tank); /*虎式坦克类,它继承了坦克父类*/class TigerTank extends Tank /该方法重写了父类中的printTank public void printTank() System.out.println(This is TigerTank); /*坦克类的测试类*/public class ClassMain public s

8、tatic void main(String args) Tank tank = new TigerTank(); tank.printTank(); /*坦克类的测试类*/public class ClassMain public static void main(String args) Tank tank = new TigerTank(); tank.printTank(); /最终的输出结果为:This is TigerTank左声明右实现Tank tank = new TigerTank();等号的左侧是Tank tank,而等号的右侧是 new TigerTank(),根据“左声

9、明右实现”的原则可以肯定左侧的Tank tank代码只是用来告诉编译器,在Tank类中拥有printTank方法,它只是对printTank方法进行了一次声明并没有真正实现(开辟空间),而真正的实现是在右侧的,new TigerTank()明确告诉了编译器,左侧的printTank方法由TigerTank来实现,因此最终使用的是TigerTank类中的printTank方法而并非是Tank类中的printTank方法,打印结果也就理所当然的为This is TigerTank了。/*坦克类的测试类*/public class ClassMain public static void main(

10、String args) Tank tank = new M1Tank(); tank.showName(); /*坦克类的测试类*/public class ClassMain public static void main(String args) Tank tank = new M1Tank(); tank.showName(); /编译出错,错误提示:没有showName这个方法抽象(面向对象编程的核心思想)把相同的或相似的对象归为一类的这个过程就是抽象,所以,抽象就是分析问题的方法;抽象的基本原则:只关心主要问题,而不关心次要问题;只关心主要矛盾,而不关心次要矛盾;只关心相同的东西,

11、而不关心不同的东西;只关心问题是什么,能够完成什么,而不关心怎样去完成。其它创建对象方法方法重载(重载(温馨提示:方法重载跟方法的返回值类型没有任何关系。也就是说,只有返回值不同的方法不能构成重载。 )重载构造重载构造方法方法this关键字关键字静态静态。类与类之间的关系类与类之间的关系“有”关系和“是”关系;“是”关系就是指类的继承关系。如:从动物类派生出哺乳动物类,那么可以说哺乳动物是动物;“有”关系是指在一个类中包含了另一个类的对象,即一个类中有另一个类(的对象),可以理解为类的嵌套。对象和对象之间的关系依赖(需要某种服务)关联(对象间有某种对应关系)聚合组合继承 。依赖类与类之间的连接

12、,依赖总是单向的。依赖关系代表一个类依赖于另一个类的定义。对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。 依赖一般情况下是以下几种情况之一:a、ClassA中某个方法的参数类型是ClassB; 这种情况成为耦合;b、ClassA中某个方法的参数类型是ClassB的一个属性; 这种情况成为紧耦合;c、ClassA中某个方法的实现实例化ClassB;d、ClassA中某个方法的返回值的类型是ClassB;关联关联是一种结构关系,说明一个事物的对象与另一个事物的对象相联系。给定一个连接两各类的关联,可以从一个类的对象导航到另一个类的

13、对象。设计模式角度看OOP设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。对象是什么? 从概念层面讲,对象是某种拥有责任的抽象。 从规格层面讲,对象是一系列可以被其他对象使用的公共接口。 从语言实现层面来看,对象封装了代码和数据。怎样才能设计“好的面向对象”? 遵循一定的面向对象设计原则 熟悉一些典型的面向对象设计模式(Spring)几条更具体的设计原则单一职责原则(SRP): 一个类应该仅有一个引起它变化的原因。开放封闭原则(OCP): 类模块应该是可扩展的,但是不可修改(对扩展开放,对

14、更改封闭)Liskov 替换原则(LSP): 子类必须能够替换它们的基类依赖倒置原则(DIP): 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。 抽象不应该依赖于实现细节,实现细节应该依赖于抽象。接口隔离原则(ISP): 不应该强迫客户程序依赖于它们不用的方法。从设计原则到设计模式针对接口编程,而不是针对实现编程 客户无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望的接口。优先使用对象组合,而不是类继承 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。继承在某种程度上破坏了封装性,子类父类耦合度高;而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。封装变化点 使

15、用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。三大基本面向对象设计原则 针对接口编程,而不是针对实现编程 优先使用对象组合,而不是类继承 封装变化点面向对象设计原则“开闭”原则(基石)里氏代换原则依赖倒转原则接口隔离原则迪米特法则结合Spring来看OOP“开闭”原则(基石)在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。从另外一个角度讲,就是所谓的“对可变性封装原则”。“对可变性封装原则”意味着两点:1 .一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。同一种可变性的不同表象意味着

16、同一个继承等级结构中的具体子类。2.一种可变性不应当与另一种可变性混合在一起。即类图的继承结构一般不应超过两做到“开闭”原则不是一件容易的事,但是也有很多规律可循,这些规律同样也是设计原则,它们是实现开闭原则的工具。Spring的BeanBean 的创建直接过程是禁止修改的,但是预留了很多接口用于扩展,比如BeanFactory用于自己完全扩展bean。Spring容器集中管理Bean的实例化,Bean实例可以通过BeanFactory的getBean(Stringbeanid)方法得到。BeanFactory是一个工厂,程序只需要获取BeanFactory引用,即可获得Spring容器管理全

17、部实例的引用。程序不需要与具体实例的实现过程耦合。大部分Java EE应用里,应用在启动时,会自动创建Spring容器,组件之间直接以依赖注入的方式耦合,甚至无须主动访问Spring容器本身。依赖倒转原则针对接口编程,不要针对实现编程。 针对接口编程的意思是,应当使用接口和抽象类进行变量的类型声明、参量的类型声明,方法的返还类型声明,以及数据类型的转换等。不要针对实现编程的意思就是说,不应当使用具体类进行变量的类型声明、参量的类型声明,方法的返还类型声明,以及数据类型的转换等。spring中都是用于接口编程Bean主要区分三个:JavaBean,EJB,POJO。JavaBeanJavaBea

18、n是公共Java类,但是为了编辑工具识别,需要满足至少三个条件:有一个public默认构造器(例如无参构造器,)属性使用public 的get,set方法访问,也就是说设置成private,同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(),N大写。需要序列化。这个是框架,工具跨平台反映状态必须的。EJB在企业开发中,需要可伸缩的性能和事务、安全机制,这样能保证企业系统平滑发展,而不是发展到一种规模重新更换一套软件系统。 然后有提高了协议要求,就出现了Enterprise Bean。EJB在javabean基础上

19、又提了一些要求,当然更复杂了。POJO有个叫Josh MacKenzie人觉得,EJB太复杂了,完全没必要每次都用,所以发明了个POJO,POJO是普通的javabean,什么是普通,就是和EJB对应的。总之,区别就是,你先判断是否满足javabean的条件,然后如果再实现一些要求,满足EJB条件就是EJB,否则就是POJO。元素是Spring配置文件的根元素元素是元素的子元素项目中Spring的Bean和接口编程单态模式是Spring Bean默认模式工厂模式工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。工厂模式的关键是:将创建对象和使用对象分开。其可分为三种:静态工厂模式、工厂方法模式、抽象工厂模式。工程模式实例里氏代换原则一个实体使用的是基类的话那么也一定适用于子类。但反过来的代换不成立。Util包Resource接口实现类ClassPathResource

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论