面向对象高级(05)-抽象类和接口的使用工厂设计模式_第1页
面向对象高级(05)-抽象类和接口的使用工厂设计模式_第2页
面向对象高级(05)-抽象类和接口的使用工厂设计模式_第3页
面向对象高级(05)-抽象类和接口的使用工厂设计模式_第4页
面向对象高级(05)-抽象类和接口的使用工厂设计模式_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、17. 面向对象高级(05) 本季要点:抽象类和接口的实际应用。本季作为上一讲的后续内容,详细讲解了Java中的抽象类和接口的使 用,并讲解了工厂设计模式。 blog: 零基础学JAVAJava SE面向对象部分-17.面向对象高级(05) 2009-02-07上季内容回顾:1、对象的多态性2、抽象类和接口本季主要知识点:抽象类和接口的实际应用1、子类对象可以为父类对象实例化,之后调用的方法都是子类中已经被覆写过的方法。2、就可以利用此特性,观察抽象类的使用,因为在抽象类中有很多的抽象方法。抽象类abstractclassApublicabstractvoidfun();classBexten

2、dsApublicvoidfun()System.out.println(B = Hello World);classCextendsApublicvoidfun()System.out.println(C = Hello World);publicclassDemo01publicstaticvoidmain(String args)A a =newB();a.fun();abstractclassApublicabstractvoidfun();classBextendsApublicvoidfun()System.out.println(B = Hello World);classCex

3、tendsApublicvoidfun()System.out.println(C = Hello World);publicclassDemo01publicstaticvoidmain(String args)A a =newC();a.fun();抽象类是可以实例化的,通过对象的多态性来实例化抽象类的主要作用是什么呢?抽象类就是类似于一个模板操作 =JAVA WEB Servlet程序,提供的就是一个模板。把上面的实际的例子变为程序abstractclassErrpublicvoidprintInfo()System.out.println(姓名:+this.getName();Syst

4、em.out.println(班级:+this.getCls();System.out.println(事由:+this.getCau();/得到姓名,由具体的子类去做publicabstractString getName();/得到班级,由具体的子类去做publicabstractString getCls();/得到事由publicabstractString getCau();classZhangSanextendsErrpublicString getName()return张三;publicString getCls()return小五班;publicString getCau()

5、return因为上课吃东西,所以被老师抓住了,所以要填写违纪卡。 ;classLiSiextendsErrpublicString getName()return李四;publicString getCls()return大五班;publicString getCau()return因为上课睡觉,所以被老师抓住了,所以要填写违纪卡。 ;publicclassDemo02publicstaticvoidmain(String args)Err e =newZhangSan();e.printInfo();我们改成李四看看效果哈abstractclassErrpublicvoidprintInfo

6、()System.out.println(姓名:+this.getName();System.out.println(班级:+this.getCls();System.out.println(事由:+this.getCau();/得到姓名,由具体的子类去做publicabstractString getName();/得到班级,由具体的子类去做publicabstractString getCls();/得到事由publicabstractString getCau();classZhangSanextendsErrpublicString getName()return张三;publicSt

7、ring getCls()return小五班;publicString getCau()return因为上课吃东西,所以被老师抓住了,所以要填写违纪卡。 ;classLiSiextendsErrpublicString getName()return李四;publicString getCls()return大五班;publicString getCau()return因为上课睡觉,所以被老师抓住了,所以要填写违纪卡。 ;publicclassDemo02publicstaticvoidmain(String args)Err e =newLiSi();e.printInfo();调用模板成功

8、了哈(模板设计)场景: 假设Person分为Worker和Student,工人的属性包括:姓名、年龄、工资,学生的属性包括:姓名、年龄、成绩,那么现在人都可以说话,但是工人和学生说的话肯定不一样。此时,肯定人中的说话方法是固定的,肯定是一个普通方法,只是说话的内容不一样。abstractclassPersonprivateString name;privateintage;publicPerson(String name,intage) = name;this.age = age;publicString getName();publicintg

9、etAge()returnthis.age;publicvoidtalk()/这是要说,内容都在此方法中System.out.println(this.getContent();publicabstractString getContent();classStudentextendsPersonprivatefloatscore;publicStudent(String name,intage,floatscore)super(name,age);this.score = score;publicString getContent()return学生说 - 姓名=+super.getName(

10、)+,年龄=+super.getAge()+,成绩=+this.score;classWorkerextendsPersonprivatefloatsalary;publicWorker(String name,intage,floatsalary)super(name,age);this.salary = salary;publicString getContent()return工人说 - 姓名=+super.getName()+,年龄=+super.getAge()+,工资=+this.salary;publicclassDemo03publicstaticvoidmain(String

11、 args)Person p1 =newStudent(张三,20,90.0f);Person p2 =newWorker(李四,30,900.0f);p1.talk();p2.talk();接口的实际应用分布式代码中最重要的就是要规定好操作的接口。接口就是定义了一个标准,只要按照此标准代码都可以正常使用。interfaceApublicString getInfo();classBimplementsApublicString getInfo()returnB - Hello World;classCimplementsApublicString getInfo()returnC - Hel

12、lo World;publicclassDemo04publicstaticvoidmain(String args)A a =newB();System.out.println(a.getInfo();证明接口对象可以实例化,通过对象多态性进行向上转型,接口是可以实例化的。我们改成C看看效果interfaceApublicString getInfo();classBimplementsApublicString getInfo()returnB - Hello World;classCimplementsApublicString getInfo()returnC - Hello Worl

13、d;publicclassDemo04publicstaticvoidmain(String args)A a =newC();System.out.println(a.getInfo();我们发现都可以利用对象多态性完成操作接口是一个标准。 USB接口 - 只要是实现了USB接口的设备就都可以向USB接口上插。举例: 假设现在设计一个USB接口,里面只有开始工作和停止工作的操作。主板上有USB接口,表示可以插入任意的USB设备。interfaceUSB/表示开始工作publicvoidstart();/表示停止工作publicvoidstop();classMainBoard/只要是USB设

14、备就可以插publicstaticvoidplugIn(USB usb)usb.start();usb.stop();classMP3implementsUSBpublicvoidstart()System.out.println(MP3开始工作);publicvoidstop()System.out.println(MP3停止工作);classPrintimplementsUSBpublicvoidstart()System.out.println(打印机开始工作);publicvoidstop()System.out.println(打印机停止工作);publicclassDemo05pu

15、blicstaticvoidmain(String args)USB u =newMP3();MainBoard.plugIn(u);现在看下效果如果是打印机呢?interfaceUSB/表示开始工作publicvoidstart();/表示停止工作publicvoidstop();classMainBoard/只要是USB设备就可以插publicstaticvoidplugIn(USB usb)usb.start();usb.stop();classMP3implementsUSBpublicvoidstart()System.out.println(MP3开始工作);publicvoids

16、top()System.out.println(MP3停止工作);classPrintimplementsUSBpublicvoidstart()System.out.println(打印机开始工作);publicvoidstop()System.out.println(打印机停止工作);publicclassDemo05publicstaticvoidmain(String args)USB u =newPrint();MainBoard.plugIn(u);这就是一个典型的操作,一切以接口标准进行操作。接口规定什么,其就可以完成什么样的工作哈举例: 听我讲课,听我讲课,我说的是中文,你听的

17、是中文,所以你能听懂,如果你再说话,你肯定也说中文,我听的也是中文。接口在实际中可以作为一种标准,那么这种标准在使用的时候就可以让类之间进行解耦合操作。接口的重要目的是解耦合: A - BclassApublicvoidfun(B b)b.print();classBpublicvoidprint()System.out.println(Hello World!);publicclassDemo06publicstaticvoidmain(String args)newA().fun(newB();此代码存在的问题: 如果现在B类的功能不能直接满足A类的要求了, 需要对B进行扩充或是把B类彻底

18、替换成另外一个C类,那么此时要完成以下步骤:修改A类、增加C类,那么问有没有这样一种可能:修改功能的时候我可以不动类A呢?可以使用接口。classApublicvoidfun(X x)x.print();interfaceXpublicvoidprint();classBimplementsXpublicvoidprint()System.out.println(Hello World!);classCimplementsXpublicvoidprint()System.out.println(Hello Java!);publicclassDemo06publicstaticvoidmain

19、(String args)X x =newC();newA().fun(x);问题: 在实际的代码中main方法实际上应该是作为一个客户端出现的。此时客户端与接口和其接口的子类是直接有关的。代码中肯定不能这样编写,因为会造成客户端(main)与具体的子类耦合。 JVM的工作原理:*.class -JVM -OS :程序可移植性高。classApublicvoidfun(X x)x.print();interfaceXpublicvoidprint();classBimplementsXpublicvoidprint()System.out.println(Hello World!);class

20、CimplementsXpublicvoidprint()System.out.println(Hello Java!);/中间再加入一个过渡端classFactorypublicstaticX getInstance(String str)X x =null;if(B.equals(str)/认为操作的是B类x =newB();if(C.equals(str)x =newC();returnx;publicclassDemo06publicstaticvoidmain(String args)X x = Factory.getInstance(B);newA().fun(x);现在在客户端就

21、看不到接口了现在换成C标记classApublicvoidfun(X x)x.print();interfaceXpublicvoidprint();classBimplementsXpublicvoidprint()System.out.println(Hello World!);classCimplementsXpublicvoidprint()System.out.println(Hello Java!);/中间再加入一个过渡端classFactorypublicstaticX getInstance(String str)X x =null;if(B.equals(str)/认为操作的

22、是B类x =newB();if(C.equals(str)x =newC();returnx;publicclassDemo06publicstaticvoidmain(String args)X x = Factory.getInstance(C);newA().fun(x);此时客户端并没有一个具体的子类出现。classApublicvoidfun(X x)x.print();interfaceXpublicvoidprint();classBimplementsXpublicvoidprint()System.out.println(Hello World!);classCimpleme

23、ntsXpublicvoidprint()System.out.println(Hello Java!);/中间再加入一个过渡端classFactorypublicstaticX getInstance(String str)X x =null;if(B.equals(str)/认为操作的是B类x =newB();if(C.equals(str)x =newC();returnx;publicclassDemo06publicstaticvoidmain(String args)if(args.length!=1)System.out.println(程序参数错误,程序无法运行!);System.exit(1);X x = Factory.getInstance(args0);newA().fun(x); 以后如果假设要增加新的子类的时候,只需要修改工厂类即可,其他地方不用做太大的修改,即:某一个代码的修改不影响被调用处的代码就是好的设计。上面的例子中执

温馨提示

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

评论

0/150

提交评论