一、什么是面向接口编程

要正确地使用Java语言进行面向对象的编程,从而提高程序的复用性,增加程序的可维护性、可扩展性,就必须是面向接口的编程。面向接口的编程就意味着:开发系统时,主体构架使用接口,接口构成系统的骨架。这样就可以通过更换实现接口的类来更换系统的实现。

例如:在上节示例中,Java接口Introduceable就是系统骨架的一个重要组成部分,这个Java接口定义了一个方法:detailo中心类和教员类分别实现了Java接口Introduceable,因此具有了不同的detail方法实现。在School2类中,print方法接收的参数类型是Introduceable,这样,就可以向print方法传递任意一个Introduceable接口的实现类,在运行时,Java虚拟机会根据实际创建的对象类型调用不同的方法实现。这就意味着:可以通过更换实现接口的类来更换系统的实现。

二、面向接口编程的示例

接下来通过一个示例详细讲解面向接口编程的实现过程。

案例需求的效果图如图1所示。

升级系统,要求如下:

★ 打印机有多种类型,比如:黑白打印机、彩色打印机等。

★ 中心可能配备其中任意一款打印机,负责打印教员或者中心的详细信息。

★ 系统要具备良好的可扩展性与可维护性。

图1 使用不同类型的打印机进行打印

采用面向接口编程的方式实现可以分为3个步骤。

1.抽象出Java接口

分析:由于黑白、彩色打印机都存在一个共同的方法特征:print,而且黑白、彩色打印机对print方法有各自不同的实现,因此可以抽象出一个Java接口PrinterFace(代表打印机),在其中定义print方法。

具体实现代码如下:

折叠

Java 代码

package Java.sg.ch03;

publicinterfacePrinterFace {

//定义打印方法

publicvoicl print (String content);

}

2.实现Java接口

分析:在第一步中已经抽象出Java接口PrinterFace,并在其中定义了print方法。由于黑白、彩色打印机对print方法有各自不同的实现,因此在第2步中,要让黑白、彩色打印机实现PrinterFace接口,各自实现print方法。

彩色打印机代码实现如下:

折叠

Java 代码

package Java.sg.ch03;

publicclassColorPrinterimplements

PrinterFace {

/**

* 打印方法

*/

publicvoidprint(String content) {

System.out.println("彩色打印 :");

System.out.println(content);

}

}

黑白打印机代码实现如下:

折叠

Java 代码

package Java.sg.ch03;

publicclassBlackPrinterimplements

PrinterFace {

/**

* 打印方法

*/

publicvoidprint(String content) {

System.out.println("黑白打印 :");

System.out.println(content);

}

}

3.使用Java接口

经验:现在,Java接口及其实现类都已经创建完毕,接着,我们就要使用面向接口编程的原则,让接口构成系统的骨架,以便达到更换实现接口的类就可以更换系统的实现的目的。

中心类负责对外提供打印功能,要求可以随时更换打印机类型。代码实现如下:

折叠

Java 代码

package Java.sg.ch03;

publicclassSchool3implementsIntroduceable{

privatePrinterFace printer;//打印机

//  输出中心的详细信息

publicString detail() {

return"这里是中心";

}

//  使用中心打印机打印信息

publicvoidprint(Introduceable intro){

printer.print(intro.detail());

}

//设置打印机

publicvoidsetPrinter(PrinterFace p) {

this.printer = p;

}

}

测试类提供main方法进行单元测试。代码实现如下:

折叠

Java 代码

/*

* jsp.sg.ch04.Test.java

* 2011-5-29

* 4u^j2JavaJavaL

*/

packageJava.sg.ch03;

publicclassTest {

publicstaticvoidmain(String[] args) {

//创建中心实例

School3 school =newSchool3();

//为该中心配备黑白打印机

school.setPrinter(newBlackPrinter());

school.print(school);

//为该中心配备彩色打印机

school.setPrinter(newColorPrinter());

school.print(school);

}

}

经验:面向接口编程可以实现接口和实现的分离,这样做的最大好处就是能够在客户端未知的情况下修改实现代码。那么什么时候应该抽象出Java接口呢?一种是用在层和层之问的调用。层和层之间是最忌讳耦合度过高或是改变过于频繁。设计优秀的接口能够解决这个问题。另一种是用在那些不稳定的部分上。如果某些需求的变化性很大,那么定义接口也是一种解决之道。设计良好的接口就像是我们日常使用的万用插座一样,不论插头如何变化,都可以使用。

最后强调一点,良好的接口定义一定是来自于需求的,它绝对不是程序员绞尽脑汁想出来的。

java 接口编程_JAVA面向接口编程相关推荐

  1. Java面向事件编程_Java面向事件编程

    基于Java的基础课程给教师和学生都提出了新的挑战.虽然Java要比C++简单,但Java作为一种具有大量标准库的面向对象语言这一事实既带来了新的复杂性,同时也带来了新的机会.. 本书作为计算机科学基 ...

  2. 为什么有人说面向对象编程就是面向接口编程?

    "面向对象编程就是面向接口编程" 这句话相信, 很多人都在网上见过, 装b利器. 我一开始也是这么想的, 那些装b者丢下这一句, 就没下文了. 首先, 我认为这句话是1个假命题. ...

  3. java面向方面编程_面向方面编程的介绍----基本概念

    面向对象的编程中常用的概念是:继承.封装.多态.在面向方面的编程中常使用的概念是:advices/interceptors, introductions, metadata, and pointcut ...

  4. Java 设计模式 Day3 之面向抽象原则:什么是面向抽象编程?面向抽象编程如何应用?

    文章目录 前言 一.什么是面向抽象编程? 二.传统场景的类设计 2.1.项目场景设计 2.2.传统类设计存在的问题 三.采用面向抽象编程的类设计 3.1.设计一个抽象类/接口 3.2.采用上转型对象/ ...

  5. 函数式编程和面向对象式编程_比较函数式编程,命令式编程和面向对象的编程

    函数式编程和面向对象式编程 As Oracle Corporation has introduced some Functional constructs in Java SE 8, now-a-da ...

  6. Java 面向抽象编程和面向接口编程

    以下内容来自<Java 2实用教程>,主编:耿祥义.张跃平 鉴于面向抽象编程和面向接口编程思维培养的重要性,写此博客巩固. 面向抽象编程: 在设计程序时,经常会使用到abstract类,其 ...

  7. Java中继承和面向接口的编程

    继承是面向对象中很重要的概念.如果考虑到Java语言特性,继承分为两种:接口继承和实现继承.这只是技术层面的问题,即便C++中不存在接口的概念,但它的虚基类实际上也相当于接口.对于OO的初学者来说,他 ...

  8. 从面向对象编程转为面向接口编程

    大家写过C++或者Java,或者其他语言,基本上都会接触到面向对象这个概念. 面向对象,本身是软件编程发展过程中的产物,当然相比于面向过程,是一种突破性的设计.但是,如果只是停留在面向对象编程,而不是 ...

  9. 面向“接口”编程和面向“实现”编程

    英文原文:Program to an Interface, Fool 如果你已经读了我的前几篇关于面向对象范式因为受到 Rust, Go 等语言的影响而发生变化的文章,看到了我正在研究的 Rust 设 ...

最新文章

  1. 信息安全 CIO最关注什么?
  2. JAVA中类的访问修饰符的作用范围
  3. 利用虚拟硬盘(把内存当作硬盘)来提高数据库的效率(目前只针对SQL Server 2000)可以提高很多...
  4. Eclipse安装阿里巴巴Java开发规约插件
  5. 从SQL Server到多数据库,微软数据库迁移全攻略
  6. 【转】win32窗口的大小,居中,拖动
  7. cmd杀死MySQL进程命令
  8. PHP中stripslashes函数的小结
  9. 计算机网络分为点到点网络和,计算机网络-判断题
  10. 1.实验:删除CentOS6下/boot/vmlinuz文件修复之
  11. 视频教程-一小时搞定简单VBA编程 Excel宏编程快速入门-Office/WPS
  12. 利用Fiddler抓包软件,爬短视频无水印,爬wei视app,步骤完整
  13. python 决策树分类 泰坦尼克生存预测
  14. 场景式营销——新商业时代的生存法则
  15. linux c++ 文件修改时间,linux下C获取系统时间的方法
  16. 白光干涉仪如何获得高度信息丨科普篇
  17. 平面度、 共面度、 翘曲度三者区别
  18. 二次吐血整理的 MAYA教程 快捷键大全,别收藏,直接粘贴拿走!
  19. php 手机当扫描仪,只会用华为手机拍照就输了,打开相机的这个功能,手机秒变扫描仪...
  20. mysql自愈_数据库跨地域容灾自愈最强攻略来了!

热门文章

  1. 开发、测试与QA的区别以及其他
  2. 《高级软件架构师讲义》学习笔记5
  3. 对Hibernate使用之愚见
  4. idea修改新的git提交地址
  5. C语言封装带省略参数的函数,C与C++的函数声明中省略参数的不同意义
  6. php获取网络文件的几种方式,PHP如何实现获取网络上的文件?
  7. 后端技术:MyBatis 知识点整理,值得收藏!
  8. 数据库:MySQL、SqlServer、Oracle对比
  9. 系统运维:收集6款经典的服务器监控工具
  10. 硬件:选购CPU和显卡需了解的参数,TDP、SDP、ACP、GCP、TBP是什么?