上一篇Java接口 详解(一)讲到了接口的基本概念、接口的使用和接口的实际应用(标准定义)。我们接着来讲。

一、接口的应用—工厂设计模式(Factory)

我们先看一个范例:

package com.wz.factoryDemo;interface Fruit{public void eat();
}class Apple implements Fruit{@Overridepublic void eat() {System.out.println("吃苹果。。。");}
}public class Client {public static void main(String[] args) {Fruit f = new Apple();f.eat();}}

运行结果:

吃苹果。。。

以上程序非常简单,就是通过接口的子类为接口对象实例化,但这样操作会存在什么样的问题呢?在软件开发中,我们强调以下两点:
(1)主方法或主类是一个客户端,客户端的操作应该越简单越好;
(2)客户端之外的代码修改,不影响用户的使用。也就是说,用户可以不用去关心代码是否由变更。

确实,以上范例没有任何语法错误,但关键的问题是客户端中出现的new关键字上。因为,一个接口会有多个子类,对于上面的Furit接口,也可能出现多个子类对象。

来看范例,我们多加上一个接口子类:

class Orange implements Fruit{@Overridepublic void eat() {System.out.println("吃橘子。。。");}}

客户端是若要得到这个新的子类对象,需要修改代码为:

public class Client {public static void main(String[] args) {//Fruit f = new Apple();Fruit f = new Orange();f.eat();}}

从上面我们发现,如果直接在客户端上产生一个实例化对象,那么我们每次要更换对象时,都需要修改客户端代码,这样的做法明显是不好的。而在整个代码中,我们最关心的是如何取得一个Fruit接口对象,然后进行方法的调用,至于这个接口对象时被谁实例化的,不是客户端关心的。这个问题就是代码耦合度太高!耦合度太高的产生的直接问题是代码不方便维护。

在本程序之中,最大的问题在于耦合上,发现在主方法中,一个接口和一个子类紧密耦合在一起,这种方式比较直接,可以简单的理解为由A —>B,但是这种紧密的方式不方便于维护,所以我们可以这样改:A—> C—>B,中间经历了一个过渡,这样一来,B改变,然后C去改变,但是A不需要改变。这可以参考Java中JVM的设计思想:程序—> JVM—>适应不同的操作系统。

于是,本程序我们这么修改,加上一个工厂类:

class Factory{public static Fruit getInstance(String className){if("apple".equals(className)){return new Apple();}else if("orange".equals(className)){return new Orange();}else{return null;}}
}

然后修改客户端:

public class Client {public static void main(String[] args) {Fruit f = Factory.getInstance("apple");f.eat();}}

运行结果:

吃苹果。。。

这样的话,客户端不会看见具体的子类,客户端不再和一个具体的子类耦合在一起了,就算以后增加了新的子类,那么只需要修改Factory类即可实现,客户端的调用不会改变。

工厂模式的关系图如下:

从工厂模式关系图看出,客户端不和具体的子类耦合在一起,若要增加新的子类,只需要修改Factory类即可实现。

二、接口的应用—代理设计模式(Proxy)

Java代理设计模式单独讲解,请移步到 Java设计模式之代理模式

所谓代理,就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

关系图如下:

代理设计模式的核心精髓就在于:有一个主题操作接口(接口中可能有多个方法),而核心业务主题只完成核心功能,而代理主题负责完成所有与核心主题有关的辅助性操作。

三、Java抽象类和接口的区别

通过上面的分析可以得出结论:在开发之中,抽象类和接口实际上都是可以使用的,并且使用那一个都没有明确的限制,可是抽象类有一个最大的缺点 : 一个子类只能够继承一个抽象类,存在单继承的局限。所以当遇到抽象类和接口都可以使用的情况下,优先考虑接口,避免单继承局限。

一些参考原则(根据自身情况参考):
(1)在进行某些公共操作的时候一定要定义出接口;
(2)有了接口就需要利用子类完善方法;
(3)如果是我们自己写的接口,尽量不要使用关键字new去直接实例化接口子类,要使用工厂类完成。

Java接口 详解(二)相关推荐

  1. Java多线程详解(二)

    评论区留下邮箱可获得<Java多线程设计模式详解> 转载请指明来源 1)后台线程 后台线程是为其他线程服务的一种线程,像JVM的垃圾回收线程就是一种后台线程.后台线程总是等到非后台线程死亡 ...

  2. java接口详解+练习题

    一.接口概述 接口是比抽象更高的抽象,它是一个完全抽象的类,即抽象方法的集合.接口使用关键字interface来声明. 二.接口定义的结构 [修饰符] interface 接口名称{ 抽象方法1; 抽 ...

  3. Java接口 详解(一)

    一.基本概念 接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合.接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 如果一个类只由 ...

  4. Java集合详解之Map

    一.首先看看集合框架体系图 从图中可以看到,Map接口扩展了Iterator接口,关于Iterator接口详解请移步:Iterator接口详解 二.Map是什么? Map<k,v>使用键值 ...

  5. Java基础——Java IO详解

    一.概述 1.Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要 ...

  6. Java基础——Java NIO详解(二)

    一.简介 在我的上一篇文章Java NIO详解(一)中介绍了关于标准输入输出NIO相关知识, 本篇将重点介绍基于网络编程NIO(异步IO). 二.异步IO 异步 I/O 是一种没有阻塞地读写数据的方法 ...

  7. Java 多线程详解(二)------如何创建进程和线程

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 在上一篇博客中,我们已经 ...

  8. 接口与继承系列教材 (十)- Java 内部类详解

    接口与继承系列教材 (十)- Java 内部类详解 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤1:非静态内部类 步骤2:静态内部类 步骤3:匿名类 步骤4:本地类 步骤5:在匿名 ...

  9. 接口详解(JAVA)

    接口详解(JAVA) 文章目录 接口详解(JAVA) 接口 接口的定义和使用 练习 接口的细节:成员特点和接口的各种关系 接口中成员的特点 接口和类之间的关系 接口中新增方法,接口应用和适配器设计模式 ...

最新文章

  1. python连接mysql
  2. java基础面试题:抽象类中是否可以有静态的main方法?
  3. salt 执行命令等待_saltstack异步执行命令
  4. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局
  5. DDD(领域驱动设计)系列之二-应用架构
  6. python post cookies_python 之post、get与cookie实战
  7. C#编程之委托与事件(一)
  8. Oracle的共享关闭 独有关闭和共享更新关闭 (2)
  9. jsoncpp添加对象、数组与json对象的解析
  10. 怎么使用计算机自带的摄像头拍视频,电脑怎么用摄像头录制视频
  11. java txt文件追加_java如何追加写入txt文件
  12. ANSYS APDL
  13. Android webview登录手机QQ
  14. PMI-ACP敏捷项目认证练习题(一)
  15. Annoy算法简单介绍
  16. PS网页设计教程XXIII——创建一个售卖iPhone 5应用程序的网站
  17. 硬件电路设计之升压/降压电路
  18. 爱情智慧:结婚是什么感觉
  19. Ardiuno驱动Apds9960手势识别
  20. 嵌入式软件测试项目管理

热门文章

  1. Python文本分析---笔记
  2. 如何做好用户故事地图?
  3. windows10驱动 x64--- 驱动实现遍历VAD树(六)
  4. 什么是java字符串_什么是java字符串
  5. sudo,su, -的区别
  6. 使用GPU进行神经网络计算详解
  7. 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI
  8. 接口文档当中,英文字母代表的含义
  9. js关闭当前窗口、标签页
  10. STC15单片机 线性按键控制LED流水灯位移