面向接口编程的小例子

以前学习Java的时候,就听过面向接口编程,可惜当时水平太低不理解(当然,现在水平还是很低),现在学习了一点。接下来,我们通过一个小例子学习面向接口编程。

背景:假设每个单身狗都喜欢和蚊子玩,蚊子有一个唱歌的方法。代码如下:

  1. //Mosquito.java
  2. //蚊子类,拥有一个唱歌的方法
  3. package project.app.service;
  4. public class Mosquito {
  5. public String sing() {
  6. return "You have to admit that I sing songs very well.";
  7. }
  8. }
  1. //Single.java
  2. //单身狗类,playWithMosquito依赖于蚊子类
  3. package project.app.service;
  4. import project.app.service.Mosquito;
  5. public class Single {
  6. private Mosquito mosquito;
  7. public void setMosquito(Mosquito mosquito) {
  8. this.mosquito = mosquito;
  9. }
  10. public void playWithMosquito() {
  11. System.out.println(mosquito.sing());
  12. }
  13. }

接下来,可以测试一下

  1. //Test.java
  2. package chris;
  3. import project.app.service.*;
  4. public class Test {
  5. public static void main(String[] args) throws Exception {
  6. Single single = new Single();
  7. Mosquito mosquito = new Mosquito();
  8. //设置single实例和mosquito实例的关系
  9. single.setMosquito(mosquito);
  10. single.playWithMosquito();
  11. }
  12. }

结果:

You have to admit that I sing songs very well.

如果之后单身狗和蚊子友谊的小船翻了,改成和蟑螂玩了,应该怎么改代码呢?一般的做法大概是这样。

增加蟑螂类。

  1. //Cockroach.java
  2. //蟑螂类,有不同于蚊子的唱歌的方法
  3. package project.app.service;
  4. public class Cockroach {
  5. public String sing() {
  6. return "I sing when everybody is in sleep.";
  7. }
  8. }

在单身狗类中,将有关蚊子的改成有关蟑螂的。

  1. //Single.java
  2. //单身狗类,playWithMosquito依赖于蟑螂类
  3. package project.app.service;
  4. import project.app.service.Cockroach;
  5. public class Single {
  6. private Cockroach cockroach;
  7. public void setCockroach(Cockroach cockroach) {
  8. this.cockroach = cockroach;
  9. }
  10. public void playWithCockroach() {
  11. System.out.println(cockroach.sing());
  12. }
  13. }

可以测试一下。

  1. //Test.java
  2. package chris;
  3. import project.app.service.*;
  4. public class Test {
  5. public static void main(String[] args) throws Exception {
  6. Single single = new Single();
  7. Cockroach cockroach = new Cockroach();
  8. single.setCockroach(cockroach);
  9. single.playWithCockroach();
  10. }
  11. }

运行结果: I sing when everybody is in sleep.

经过上面的实践,我们发现,单身狗类依赖于蚊子类,导致蚊子类变化成蟑螂类时,单身狗类的代码必须跟着改变,这样类之间的耦合性太强了。我们想想,蚊子和蟑螂虽然唱着不同的歌,但是唱歌的方法却是相同的。为了代码能够降低耦合,我们可以使用接口,利用面向对象的多态性。可以将蚊子和蟑螂抽象一下,在概念上,往上升一级,比如宠物,动物,生物,物质。动物、生物和物质这几个接口就太宽了,也把单身狗包括进去了,那么,我们选择到宠物这一层。我们通过例子看一下。

  1. //Pet.java
  2. //宠物接口,有一个唱歌的方法
  3. package project.app.service;
  4. public interface Pet {
  5. public String sing();
  6. }

蚊子类实现宠物接口

  1. //Mosquito.java
  2. //
  3. package project.app.service.impl;
  4. import project.app.service.Pet;
  5. public class Mosquito implements Pet {
  6. public String sing() {
  7. return "You have to admit that I sing songs very well.";
  8. }
  9. }
  1. //Single.java
  2. //单身狗类,playWithMosquito依赖于Pet接口,注意,这个时候单身狗类只依赖于宠物接口,不依赖于具体的蚊子类了。
  3. package project.app.service;
  4. import project.app.service.Pet;
  5. public class Single {
  6. private Pet pet;
  7. public void setPet(Pet pet) {
  8. this.pet = pet;
  9. }
  10. public void playWithPet() {
  11. System.out.println(pet.sing());
  12. }
  13. }
  1. //Test.java
  2. package chris;
  3. import project.app.service.Single;
  4. import project.app.service.Pet;
  5. import project.app.service.impl.Mosquito;
  6. public class Test {
  7. public static void main(String[] args) throws Exception {
  8. Single single = new Single();
  9. Mosquito mosquito = new Mosquito();
  10. single.setPet(mosquito);
  11. single.playWithPet();
  12. }
  13. }

如果我们改成和蟑螂玩,则修改代码时,增加蟑螂类的代码(也要实现宠物接口),单身狗类不用变(耦合性大大降低啊,节省了好多重复劳动)。

  1. //Cockroach.java
  2. //蟑螂类,有唱歌的方法
  3. package project.app.service.impl;
  4. import project.app.service.Pet;
  5. public class Cockroach implements Pet {
  6. public String sing() {
  7. return "I sing when everybody is in sleep.";
  8. }
  9. }

测试代码经过轻微的修改:

  1. //Test.java
  2. package chris;
  3. import project.app.service.Single;
  4. import project.app.service.Pet;
  5. import project.app.service.impl.Cockroach;
  6. public class Test {
  7. public static void main(String[] args) throws Exception {
  8. Single single = new Single();
  9. Cockroach cockroach = new Cockroach();
  10. single.setPet(cockroach);
  11. single.playWithPet();
  12. }
  13. }

上面的例子可以算是面向接口编程的一个例子。通过使用接口,利用面向对象的多态性,将蚊子类抽象成宠物接口,使单身狗类只依赖于抽象的宠物接口,大大降低了单身狗类对具体的蚊子类的依赖。这样,大大地方便了后期的扩展和维护,比如增加会唱歌的蟋蟀类等。

From WizNote

时间: 2024-09-29 10:43:21

面向接口编程的小例子的相关文章

Spring学习(2):面向接口编程思想

一. 引言 Spring核心的IOC的实体用了面向接口编程思想,所以有必要了解下.简单来说的话,Spring就是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 接口的定义的概念:泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式.关注点:抽象化,交互.(实体提供给外部的功能抽象化成一个接口(java概念),使得内部修改不影响外部与其的交互.(关注点由具体实现转移到接口交互)) 二. 正文

面向接口编程详解(二)——编程实例

通过上一篇文章的讨论,我想各位朋友对“面接接口编程”有了一个大致的了解.那么在这一篇里,我们用一个例子,让各位对这个重要的编程思想有个直观的印象.为充分考虑到初学者,所以这个例子非常简单,望各位高手见谅. 问题的提出 定义:现在我们要开发一个应用,模拟移动存储设备的读写,即计算机与U盘.MP3.移动硬盘等设备进行数据交换. 上下文(环境):已知要实现U盘.MP3播放器.移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的移动存储设备,所以计算机必须有扩展性

面向接口编程详解(一)——思想基础

我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到“面向接口编程”这个短语,那么它是什么意思?有什么思想内涵?和面向对象编程是什么关系?本文将一一解答这些疑问. 1.面向接口编程和面向对象编程是什么关系 首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分.或者说,

面向接口编程详解(三)——模式研究

通过前面两篇,我想各位朋友对“面向接口编程”的思想有了一定认识,并通过第二篇的例子,获得了一定的直观印象.但是,第二篇中的例子旨在展示面向接口编程的实现方法,比较简单,不能体现出面向接口编程的优势和这种思想的内涵.那么,这一篇作为本系列的终结篇,将通过分析几个比较有深度的模式或架构,解析隐藏其背后的面向接口思想.这篇我将要分析的分别是MVC模式和.NET平台的分层架构. 这篇的内容可能会比较抽象,望谅解. 1.从MVC开始 MVC简介: 本文不打算详细解释MVC架构,而是把重点放在其中的面向接口

C#面向接口编程详解(1)——思想基础

我想,对于各位使用面向对象编程语言的程序员来说,"接口"这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到"面向接口编程"这个短语,那么它是什么意思?有什么思想内涵?和面向对象编程是什么关系?本文将一一解答这些疑问. 1.面向接口编程和面向对象编程是什么关系 首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思

什么叫面向接口编程以及面向接口编程的好处

http://www.cnblogs.com/xyqCreator/archive/2012/11/06/2756687.html 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的.在这种情况下,各个对象内部是如何实现自己的对系统设计人员来讲就 不那么重要了:而各个对象之间的协作关系则成为系统设计的关键.小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系 统设计的主要工作内容.面向接口编程我想就是指按照这种思想来编程吧!实际上,在日常工作中

c# BackGroundWorker 多线程操作的小例子

在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示元,必要进,还要控制后台线程中断当前操作. 以前,类似的应用会比较麻烦,需要写的代码较多,也很容易出现异常.在 .net中,提供了一个组件 backgroundworker就是专门解决这个问题的. 使用这个组件其实非常简单,例如,我们做一个类似如下界面的进度条的小例子,在后台线程中进行耗时运算,同时

面向接口编程详解

一:思想基础 我想,对于各位使用面向对象编程语言的程序员来说,"接口"这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到"面向接口编程"这个短语,那么它是什么意思?有什么思想内涵?和面向对象编程是什么关系?本文将一一解答这些疑问. 1.面向接口编程和面向对象编程是什么关系 首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附

设计与实现分离——面向接口编程(OO博客第三弹)

如果说继承是面向对象程序设计中承前启后的特质,那么接口就是海纳百川的体现了.它们都是对数据和行为的抽象,都是对性质和关系的概括.只不过前者是纵向角度,而后者是横向角度罢了.今天呢,我想从设计+语法角度说一说我感受到的面向接口编程,从而初探设计与实现分离的模式. (本文所使用的面向对象语言为java,相关代码都是java代码) 设计--接口抽象设计 继承的思想很容易理解,提取几类相近数据中的公共部分为基类,各个独立部分在基类的基础上做自己专属的延伸.接口是抽象概括输入和输出,而具体的实现交由具体实