`
huntfor
  • 浏览: 201555 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

白话面向接口编程

 
阅读更多

引子:小时候布置作业的时候,我的老师一般会把布置的作业写在一张纸上,把纸交给课代表,再有课代表把作业告诉同学们,收作业的时候也是,老师一般会问课代表要作业,收作业的工作并不会亲自动手,干活的始终都是课代表。

 

所以,打我们上小学开始,我们就已经开始接触面向接口了,课代表就是老师与学生之间的接口。再抽象一点,比如小学班里只有一个老师,教语文,数学,英语三门课,有个小班长,是老师的助理,班长手下有三个课代表,分别对应于三门课,收作业的时候,老师只需要对班长说“收作业”(班长是接口,或者抽象类),班长会对三个课代表说“收作业”(多态,三个课代表是实现),这样就达到了目的,而不需要对每个课代表都说一遍“收XX作业”。当指令需要带动时,老师只需要对班长说“把每门的作业上面写上title”,班长继续相关指令“每门作业写上是哪门课的”,这样班里同学就会在语文作业本上写上“语文”两个大字,数学本上写上“数学”,以此类推。

 

看到这里大家应该对面向接口有一个初步的了解了,当一个工程的实现类比较多的时候,比如说课代表比较多,老师是不需要对每个课代表发布指令的,因为每个课代表的基本职能是类似的,只是实现不一样罢了,所以就可以抽象出一个接口(班长),让课代表各自实现班长的方法,这样以后老师下达指令(编程)就只需要面向班长就可以了。而不需要对每个课代表所谓面向接口编程。

 

下面看看官方版解释:

接口应该是定义实现分离。接口的本身反应了系统设计人员对系统的抽象理解。一般的,当我们在编写一个系统或者工具的时候,我们在意的是,这个工具能做什么,而不是它是怎么做的。即,我们不关注它是怎么实现的,按照这种思想来编程,即面向接口编程。

 

画外音:正如很多书中,接口名的定义一般都是readable,moveable等等,从名称上就可以看出接口是表示其实现类能(can do )做什么。普通类(包括抽象类)则表示其子类是(is a kind of)什么,Thinking in Java中的命名很有门道。

 

 再来看面向接口与面向对象编程的关系

首先我们要确定的是,面向接口属于面向对象的范畴,个人觉得,面向接口只是对面向对象又做了一层封装,将what to do 和how to do 做了分离,比如最简单的计算机主板给我们提供了各种各样的接口,拿USB接口来说,对计算机而言,需要一个输入设备,至于你插的是普通键盘还是机械键盘,它都不关心,计算机只面向了USE插口,只要是符合这个插口规范的设备,都一视同仁,并不需要对滚轮鼠标、光电鼠标、甚至各种牌子的鼠标分别处理。

 

再者,来看JAVA的跨平台性,JVM本身也是面向接口的,对上提供的JDK库是统一的,对各个操作系统的编译器是不同的,只要你编写的代码符合对上的接口,对于任何OS都一视同仁,并不需要码农对每种OS分别处理(这所谓一次编写,到处运行)这下大家看到面向对象的好处了吧。接口层,将规范(what to do)与实现(how to do)做了分离,再配合多态(接口的意义,希望大家还记得各科课代表的例子),可以轻易的提升软件灵活性以及可维护性。

 

下面我们举一个学习多态时候的小例子,来看一下什么叫面向接口:

 

既然是接口,首先定义一个接口:

 

package Gof;

public interface Runable {
	void walk();
	void run();
	void stop();
}
 

 

好了,接下来我们针对Runable编写几个实现类

 

package Gof;

public class InterfaceOriented {
	
	//参数设为接口,从而避免了为每个实现类定义一个相同的方法
	//这个方法还可以修改逻辑的顺序,比如stop->walk->run->walk->stop等等,只需一份就好
	private static void doEverything(Runable runable){
		System.out.println("now I am ready to run....");
		runable.run();
		System.out.println("I am tired and wanna walk for a while...");
		runable.walk();
		System.out.println("I am totally tired wanna stop....");
		runable.stop();
	}
	public static void main(String[] args) {
		
		Runable person = new Person();
		Runable cat = new Cat();
		Runable dog = new Dog();
		Runable fox = new Fox();
		doEverything(person);
	}
	
	
}


class Person implements Runable{
	@Override
	public void run(){
		System.out.println("people run....");
	}
	@Override
	public void walk(){
		System.out.println("people walk....");
	}
	@Override
	public void stop(){
		System.out.println("people stop....");
	}
}

class Cat implements Runable{
	@Override
	public void run(){
		System.out.println("cat run....");
	}
	@Override
	public void walk(){
		System.out.println("cat walk....");
	}
	@Override
	public void stop(){
		System.out.println("cat stop....");
	}
}

class Dog implements Runable{
	@Override
	public void run(){
		System.out.println("dog run....");
	}
	@Override
	public void walk(){
		System.out.println("dog walk....");
	}
	@Override
	public void stop(){
		System.out.println("dog stop....");
	}
}

class Fox implements Runable{
	@Override
	public void run(){
		System.out.println("fox run....");
	}	@Override
	public void walk(){
		System.out.println("fox walk....");
	}	
	@Override
	public void stop(){
		System.out.println("fox stop....");
	}
}
 

 

如果突然来了一只狼wolf,那么只需要将wolf作为参数传进去即可,这里我们定义的doEverything方法是面向Runable接口的,只要符合这个标准(实现类)都可以直接插入作为参数。是不是很像只要符合鼠标规范的,就可以直接插入USB接口?

 

 

当然面向接口编程中指的接口并非狭义的接口,而是更高层的抽象,就拿本例来说,还可以做更高一层的抽象,比如下篇博文要介绍的工厂模式。

 

 

分享到:
评论

相关推荐

    白话windows编程.rar

    《白话Windows编程》是一本面向初学者和中级程序员的指南,旨在用通俗易懂的语言讲解Windows操作系统下的程序开发技术,主要关注C++语言在Windows平台的应用。这本书深入浅出地介绍了如何使用C++进行Windows API编程...

    软件设计本质论—白话面向对象

    在实际编程中,面向对象设计原则如单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)和接口隔离原则(ISP)也是OOP实践中不可或缺的部分。这些原则指导开发者如何构建可维护、可扩展...

    《白话C++》教程章节完整版

    《白话C++》教程是一本面向初学者和有一定编程基础的人士的C++学习资料。本书以通俗易懂的语言,生动有趣的例子,深入浅出地解析了C++这一强大的编程语言,使得学习者能够更轻松地掌握C++的基础与进阶知识。 C++是...

    白话C#之第一话 初学C的看看吧

    在编程世界中,C#是一种由微软公司推出的面向对象的编程语言,它的设计目标是用于构建Windows应用程序,尤其是与.NET框架结合使用。本篇“白话C#之第一话”将带初学者走进C#的大门,理解其基础概念和语法特性。 1. ...

    旧版资料白话c++旧版资料

    通过《旧版资料白话C++》的深入学习,读者不仅可以掌握C++的基础知识,还能了解到面向对象编程的设计思想和实践技巧,为进一步深入研究C++或其他编程语言打下坚实的基础。这份资料的价值在于它以简洁易懂的语言解释...

    白话c++

    《白话C++》是一本面向初学者的C++教程,旨在用通俗易懂的语言讲解这一强大而复杂的编程语言。C++是计算机科学中的一个重要里程碑,由Bjarne Stroustrup于1979年发展起来,是C语言的增强版,引入了面向对象编程、...

    以深度学习的模型搭建和训练过程为例,解释面向对象编程中22种设计模式的基本原理.zip

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将程序设计中的实体抽象为对象,通过对象之间的交互实现功能。在深度学习的模型搭建和训练过程中,我们可以看到许多OOP设计模式的应用。...

    《白话人工智能与大数据》代码.zip

    《白话人工智能与大数据》是一本面向初学者和进阶者的人工智能与大数据领域的书籍。这本书通过简洁易懂的语言,旨在帮助读者理解这两个领域的核心概念和技术。代码.zip压缩包包含的是书中涉及到的实例源代码,方便...

    Java基础知识面试题(2020最新版).pdf

    面向对象编程强调封装、继承和多态,其中多态是通过接口或继承实现的,Java通过方法重写和重载实现多态。面向对象的五大基本原则包括单一职责原则、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。 类与接口...

    smart-lottery 抽奖系统 项目是一款互联网面向C端人群营销活动类的抽奖系统

    3. **Java**:作为项目的编程语言,Java以其跨平台、面向对象和强大的库支持等特点,为系统提供了稳定的基础。在抽奖系统中,Java可能用于实现业务逻辑、数据处理、用户交互等功能,确保系统运行的稳定性和安全性。 ...

    Java 分布式项(SSM、分布式Dubbo、全文检索Solr、Vue、Zookeeper

    Dubbo的核心设计理念是"面向接口编程",使得服务提供者和服务消费者之间通过接口进行通信,降低了服务之间的耦合度。 3. **SpringBoot**: 虽然在标题中没有直接提到SpringBoot,但在现代Java开发中,SpringBoot...

    基于 SpringBoot + Vue 前后端分离开发的动态个人博客系统源码(适合全栈个人学习、毕设、二次开发迭代)

    面向AOP编程:通过自定义注解实现接口限流、操作日志记录等 …… 开发环境 工具:IntelliJ IDEA JDK 1.8 数据库:MySQL 8.0.15 项目构建:后端Maven、前端 Webpack 后端 Web框架:Spring Boot 安全框架:Spring ...

    Linux C编程实战代码(可运行在ZYNQ7010开发板).zip

    最后,C++作为标签出现,意味着可能在这个项目中也使用到了C++的一些特性,比如面向对象编程、模板或者STL库。尽管C++不是Linux系统编程的首选语言,但在某些场景下,它的高级特性可以提高代码的可读性和复用性。 ...

    Springboot集成Dubbo,“仿猫眼”院线系统.zip

    2. **接口与实现分离**:Dubbo鼓励采用面向接口编程,服务提供者实现接口,服务消费者通过接口调用服务,实现了服务的解耦。 3. **远程调用协议**:Dubbo支持多种通信协议,如Dubbo协议、HTTP、RMI等,其中Dubbo...

    基于python的系统设-paper-ma笔记

    它支持函数式、面向对象和过程式编程范式。Python的“白话”语法使得代码可读性强,降低了理解和维护的成本。 二、Python在系统设计中的应用 1. 系统脚本:Python常用于自动化任务,如文件管理、系统监控和网络数据...

    Linux C编程实战 音像图书租赁信息系统 课程设计.zip

    3. **C++进阶**:虽然主要编程语言是C,但标签中提到了C++,意味着可能需要利用C++的面向对象特性,如类、对象、继承、多态等。你可以用类来封装图书和租赁信息,通过对象来管理和操作数据。 4. **数据库接口**:...

    Python源码剖析

    类和面向对象编程是Python的重要组成部分,元类(metaclass)和描述符(descriptor)是进阶主题,理解它们能深入理解Python的类机制。 6. **模块与包的导入机制**: Python的模块导入系统涉及到`__import__`函数、...

    毕业设计-基于 Flask 框架开发的微信小程序后端项目,用于构建小程序商城后台

    AOP(面向切面编程)设计,实现 参数校验层 & 异常统一处理层 Ubuntu 16.04上 Nginx + Gunicorn + Pipenv部署 内置 用户管理:提供用户的相关配置 权限组(角色)管理:接口权限分配和菜单权限分配 菜单管理:实现后端...

    基于Flask框架开发的微信小程序后端项目,用于构建小程序商城后台,电商相关;rbac权限管理;自动生成Swagger 风格文档

    AOP(面向切面编程)设计,实现 参数校验层 & 异常统一处理层 Ubuntu 16.04上 Nginx + Gunicorn + Pipenv部署 内置 用户管理:提供用户的相关配置 权限组(角色)管理:接口权限分配和菜单权限分配 菜单管理:实现后端...

    基于python Flask 框架开发的微信小程序后端项目,用于构建小程序商城后台

    AOP(面向切面编程)设计,实现 参数校验层 & 异常统一处理层 Ubuntu 16.04上 Nginx + Gunicorn + Pipenv部署 功能: 用户管理:提供用户的相关配置 权限组(角色)管理:接口权限分配和菜单权限分配 菜单管理:实现后端...

Global site tag (gtag.js) - Google Analytics