适配器类(便利类)的由来:当你自己写的类中想用某个接口中个别方法的时候(注意:不是所有的方法),肿么办?

简介: 有的时候需要将接口和抽象类配合起来使用,这样可以为开发者提供相当的便利性,开发者觉得哪个方便就选用哪个。这样的抽象类称为便利类。此时,便利类并不需要实现接口的所有方法,可以留给继承它的子类去实现它们。 抽象父类提供给子类一个方法,主要是起规范作用,你不写父类这个方法也行。

有的时候需要将接口和抽象类配合起来使用,这样可以为开发者提供相当的便利性,开发者觉得哪个方便就选用哪个。这样的抽象类称为便利类。此时,便利类并不需要实现接口的所有方法,可以留给继承它的子类去实现它们。

抽象父类提供给子类一个方法,主要是起规范作用,你不写父类这个方法也行。

如果是接口的话,子类就一定要复写父类所有的抽象方法。

-----------------------------------------------------------------------------

当你自己写的类中想用某个接口中个别方法的时候(注意:不是所有的方法),肿么办?

那么你就可以用一个抽象类先实现这个接口(注意:仅仅是空实现:方法体为空),然后再用你的类继承这个抽象类,在你的类中用哪个方法就实现哪个方法,这样就可以达到目的了;

如果你直接用类实现接口,那接口的所有方法都必须实现的。

示例代码如下:

问题:

  接口(方法比较多) --> 实现类(我仅仅是使用其中的一个方法,也得把其他的方法给实现了,哪怕是空实现)

 1 package cn.itcast_03; // 接口
 2 
 3 /*
 4  * 针对用户操作的四种功能的接口
 5  */
 6 public interface UserDao {
 7     public abstract void add();
 8 
 9     public abstract void delete();
10 
11     public abstract void update();
12 
13     public abstract void find();
14 }
 1 package cn.itcast_03; // 实现类
 2 
 3 public class UserDaoImpl implements UserDao {
 4 
 5     @Override
 6     public void add() {
 7         System.out.println("添加功能");
 8     }
 9 
10     @Override
11     public void delete() {
12         System.out.println("删除功能");
13     }
14 
15     @Override
16     public void update() {
17         System.out.println("修改功能");
18     }
19 
20     @Override
21     public void find() {
22         System.out.println("查找功能");
23     }
24 
25 }
 1 package cn.itcast_03; // 测试类
 2 
 3 /*
 4  * 问题:
 5  *         接口(方法比较多) --> 实现类(我仅仅是使用其中的一个方法,也得把其他的方法给实现了,哪怕是空实现)
 6  */
 7 public class UserDaoTest {
 8     public static void main(String[] args) {
 9         UserDao ud = new UserDaoImpl();
10         ud.add();
11         // 该实现类里面实现了四种功能,我仅仅使用一种功能,可是我并不需要实现这么多功能啊!肿么办?
12         
13     }
14 }

解决方案:
  接口(方法比较多) --> 适配器类(实现接口,仅仅是空实现:方法体为空) --> 实现类(用哪个方法就重写哪个方法)

注意:

  适配器类是抽象类

  实现有两种:一种是真正的实现,即方法体里面有内容;另一种是空实现,方法体里面没有内容。

情况1:如果适配器类仅仅是实现了接口,但是并不提供方法的空实现。则适配器类没有起到作用,实现类还是要重写接口的所有方法。问题同上了。(虚晃一枪啊)

情况2:如果适配器类不仅是实现了接口,还提供了方法的空实现。则适配器类就起到作用了,实现类中用哪个方法就重写哪个方法。达到目的!

以下是情况2的示例代码:

 1 package cn.itcast_03; // 接口
 2 
 3 /*
 4  * 针对用户操作的四种功能的接口
 5  */
 6 public interface UserDao {
 7     public abstract void add();
 8 
 9     public abstract void delete();
10 
11     public abstract void update();
12 
13     public abstract void find();
14 }
 1 package cn.itcast_03; // 适配器类
 2 
 3 public abstract class UserAdapter implements UserDao {
 4 
 5     @Override
 6     public void add() {
 7     }
 8 
 9     @Override
10     public void delete() {
11     }
12 
13     @Override
14     public void update() {
15     }
16 
17     @Override
18     public void find() {
19     }
20 
21 }
1 package cn.itcast_03; // 实现类
2 
3 public class UserDaoImpl2 extends UserAdapter {
4     @Override
5     public void add() {
6         System.out.println("添加功能");
7     }
8 
9 }
 1 package cn.itcast_03; // 测试类
 2 
 3 /*
 4  * 解决方案:
 5  *         接口(方法比较多) --> 适配器类(实现接口,仅仅是空实现:方法体为空) --> 实现类(用哪个方法就重写哪个方法)
 6  */
 7 public class UserDaoTest {
 8     public static void main(String[] args) {
 9         UserDao ud2 = new UserDaoImpl2();
10         ud2.add();
11     }
12 }

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
4月前
|
Java 程序员 C++
抽象类 vs 接口:如何在实际项目中做出正确选择?
小米讲解了Java中的抽象类和接口,分析了两者的异同及使用场景。抽象类适合共享状态和行为逻辑,接口适用于提供统一行为规范,尤其在多继承场景下。文中通过实例说明了如何选择使用抽象类或接口,帮助开发者更好地理解这两者在实际开发中的应用。
57 0
|
5月前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
|
9月前
|
Java
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
79 4
|
9月前
|
Java
Java面向对象编程,如何定义一个接口并在类中实现它?
Java面向对象编程,如何定义一个接口并在类中实现它?
145 1
系统认知Java接口、接口与继承、接口与多态
在面向对象的基础之上,接口的出现是类性质的一种完善,是继承机制的一种补充,是体现多态性的一种形式。从生活实际出发,接口把它之下一系列复杂的逻辑,功能等通过“实现接口”的方式封装简化出来,只通过连接一个小小的口子就轻而易举地实现了背后实则很复杂的功能。我想这就是接口存在的意义所在吧。
240 0
系统认知Java接口、接口与继承、接口与多态
|
Java 容器
Java面向对象接口
Java面向对象接口
140 0
|
Java C++
保守VS开放?看清封装对象属性 | 带你学《Java面向对象编程》之四
高楼万丈,起于平地。本节通过对比正反几个实例剖析了封装对象属性的必要性,介绍了进行封装的基本原则。
保守VS开放?看清封装对象属性   |  带你学《Java面向对象编程》之四
先鸡后蛋-继承类实例化分析 | 带你学《Java面向对象编程》之三十七
本节结合实例讲解了继承类实例化的详细过程,并通过另一则案例验证了实例化继承类的同时必先实例化父类的说法。
【自然框架】 页面里的父类——把共用的东东都交给父类,让子类专注于其他。
【类图】【命名空间】——————————————————【文件截图】   可能您会问,不就是弄个父类吗,怎么又是这么复杂呢?这个嘛,听我慢慢道来。 (类图里面Tree、Main1、DataDelete1、DataForm1、DataList1不是父类,而是共用页面)       这个是依据自然框架的特点来设置的,目的就是把共用的代码都放到父类里面,减轻子类的代码量。
913 0
接口与抽象类的区别?区别就是抽象类已经(渐渐地渐渐地)不用了.
如能接口,何须抽象. 将编程看作是一门艺术,而不单单是个技术。 敲打的英文字符是我的黑白琴键, 思维图纸画出的是我编写的五线谱。 当美妙的华章响起,现实通往二进制的大门即将被打开。
784 0