首页 > 编程语言 >Java教程学习:揭秘什么是面向接口编程

Java教程学习:揭秘什么是面向接口编程

时间:2023-01-15 10:06:19浏览次数:47  
标签:编程 Java USB void work 外置 public println 揭秘


先用一个案例来给大家说明一下面向接口编程。

案例:有一个电脑类(Computer),电脑除了有基本的开机关机功能外,还有连接任何外接设备的功能,比如能电脑能连接外置键盘(Keyboard),鼠标(Mouse),投影仪(Projecter)等很多外置设备,请用代码来实现该需求;

实现步骤如下:

首先需要创建三个类Keyboard,Mouse,Projecter即键盘、鼠标、投影仪类,并且都有自己的功能

其次需要创建一个Computer类,类里面有开机(openComputer)方法,也有关机(closeComputer)方法,而且还有三个接收外置设备的方法connectKeyboard,connectMouse,connectProjecter,代码如下:

//  键盘类
public class Keyboard {
public void work(){
System.out.println("外置键盘可以用来输入数据");
}
}

// 鼠标类
public class Mouse{
public void work(){
System.out.println("鼠标方便操作人员打开一些程序");
}
}

// 投影仪类
public class Projecter{
public void work(){
System.out.println("投影仪把屏幕投影到墙上放大");
}
}

// 定义笔记本类
// 功能: 开机,关机,接收外置设备 键盘 鼠标 投影仪 并让其工作

public class Computer {
//开机
public void openComputer(){
System.out.println("笔记本开机");
}
//关机
public void closeComputer(){
System.out.println("笔记本关机");
}
//连接外置键盘 并让其输入
public void connectKeyboard(Keyboard k){
k.work();
}
//连接鼠标 并让其点击
public void connectMouse(Mouse m){
m.work();
}
//连接投影仪 并让其投影
public void connectProjecter(Projecter p){
p.work();
}
}

现在这个需求我们就已经做完了。但是假如此时一些电脑配件的生产商又生产出了一种新设备“U盘”用来做外置存储的,那么这时候我们除了需要再写一个U盘类之外,还需要在Computer类中加一个连接U盘的方法(这体现在现实生活中就是把原来已经制作好的电脑解体重新改装出一个用来连接U盘的口子),增加的代码如下:

//  U盘类
public class UDisk{
public void work(){
System.out.println("U盘可以用来存储数据");
}
}

// 定义笔记本类
// 功能: 开机,关机,接收外置设备 键盘 鼠标 投影仪 并让其工作
public class Computer {
//开机
public void openComputer(){
System.out.println("笔记本开机");
}
//关机
public void closeComputer(){
System.out.println("笔记本关机");
}

//连接外置键盘 并让其输入
public void connectKeyboard(Keyboard k){
k.work();
}

//连接鼠标 并让其点击
public void connectMouse(Mouse m){
m.work();
}

//连接投影仪 并让其投影
public void connectProjecter(Projecter p){
p.work();
}

//连接U盘 并让其存储
public void connectUDisk(UDisk u){
u.work();
}
}

对于U盘新设备,我们经过改装电脑,可以让电脑连接使用了。但是可恨的是 就在此时,电脑配件的生产商又生产出了外置音响,我们快要疯了,因为我们不得不又要把电脑拆了,重新改装出一个连接外置音响的口子。这时候我们并没有着急去改装自己的电脑,因为万一自己改装完了之后 电脑配件生产商又生产出了其他的外置设备呢?难道我们就一直改装下去吗?那究竟有没有一种解决办法呢??

答案是肯定的,接口的出现很好的解决了这一问题,我们向电脑配件生产商提供了一套规范 名叫USB,告诉他们以后再生产任何的设备都要留出USB形状的对接口,那么我们的电脑只需要留出一个USB形状的对接口,用来连接任何具有该形状对接口的设备即可,改进代码如下:

//  定义笔记本类
// 功能: 开机,关机,接收任何USB设备
public class Computer {
//开机
public void openComputer(){
System.out.println("笔记本开机");
}
//关机
public void closeComputer(){
System.out.println("笔记本关机");
}
//连接USB设备 并让其进行相应的工作
public void connectUSB(USB device){ //父接口的引用可以接收任何的子类对象,多态!
device.work(); //此处运行的是子类的重写后的work方法
}
}

// 自定义的USB接口
// 规范 USB设备能运行并完成相应的功能
public interface USB {
public abstract void work();
}

// 键盘类

public class Keyboard implements USB{
public void work(){
System.out.println("外置键盘可以用来输入数据");
}
}

// 鼠标类

public class Mouse implements USB{
public void work(){
System.out.println("鼠标方便操作人员打开一些程序");
}
}

经过这样的设计,我们的电脑只要留出用来连接USB设备的对接口就可以了,不管生产商们生产任何的外接设备,只要他们按照USB接口规范来,他们都能够接入到电脑上去,这样就极大的增强了电脑的拓展性,以及设备的可维护性。

经过这个案例,大家应该明白面向接口编程给我们带来的便利了吧。面向接口编程就是增强了代码的拓展性,而接口就是体现的一种规范,也是提现的一种拓展思想。

标签:编程,Java,USB,void,work,外置,public,println,揭秘
From: https://blog.51cto.com/u_8238263/6008217

相关文章

  • java基础教程:IO流
    一:IO流的分类1)按流向分:输入流:读取数据,把持久设备的数据读取到内存中。输出流:写出数据,把内存的数据写出到持久设备。2)按数据类型分:计算机中一切数据都是:字节数据。字符数据:底......
  • Java基础教程:ArrayList入门
    1ArrayList类概述什么是集合提供一种存储空间可变的存储模型,存储的数据容量可以发生改变ArrayList集合的特点底层是数组实现的,长度可以变化泛型的使用用于约束集合中存储......
  • java:Redis持久化
    一.redis持久化的介绍Redis的持久化指的是将内存中redis数据库运行的数据,写到硬盘文件上。Redis持久化的意义主要在于故障恢复,比如你部署一个Redis,作为缓存有可能里边有......
  • JavaScript 中搜索数组元素的四种方法
    在实际开发当中,我们经常会遇到类似诸如下面的需求:获取满足特定条件的数组中的所有项目要检查是否满足条件?检查数组中是否有特定值?在数组中找到指定值的索引?在本文中,我们将讨......
  • 《跟老卫学 HarmonyOS 开发》:DevEco Studio 启用Java预览器
    老版的DevEcoStudio只支持layout资源类型的XML文件的预览。在新版的DevEcoStudio已经能够支持 Ability/AbilitySlice的Java类文件的预览。新版的DevEcoStudio默认......
  • 【Java 数据结构及算法实战】系列 013:Java队列07——双端队列Deque
    双端队列(Deque),顾名思义是可以在队列的两端插入和移除元素的特殊队列。Java提供了java.util.Deque<E>接口以提供对双端队列的支持。该接口是JavaCollectionsFramework的一......
  • 【Java数据结构及算法实战】系列008:Java队列02——阻塞队列BlockingQueue
    阻塞队列(BlockingQueue)是一种支持额外操作的队列,这两个附加的操作是:l  在队列为空时,获取元素的线程会等待队列变为非空。l  当队列满时,存储元素的线程会等待队列可用。J......
  • 编程:C语言内存的堆栈模型
    内存:C语言内存的堆栈模型    一、C语言内存的堆栈模型 1、栈:栈底是高地址,栈顶是低地址。栈空间的地址生长方向:从高地址到低地址。 2、堆:堆底是低地......
  • NET.AutoApi原理揭秘
    前言上一篇文章我们讲了怎么使用NET.AutoApi这个组件来动态生成webapi接口,让我们不需要创建控制器去转发业务层代码。这篇文章主要是讲解NET.AutoApi底层是怎么实现动......
  • Docker部署Java项目运行命令脚本
    项目名称x-schools-server部署教程cd/app/webapps/x-schools-server#全部移除cd/app/webapps/x-schools-serverdockerstop$(dockerps-aqf"name=x-schools-......