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

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

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

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

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

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

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

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

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

示例代码如下:

问题:

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

 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 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
13天前
|
Java 程序员 C++
抽象类 vs 接口:如何在实际项目中做出正确选择?
小米讲解了Java中的抽象类和接口,分析了两者的异同及使用场景。抽象类适合共享状态和行为逻辑,接口适用于提供统一行为规范,尤其在多继承场景下。文中通过实例说明了如何选择使用抽象类或接口,帮助开发者更好地理解这两者在实际开发中的应用。
14 0
|
6月前
|
XML JSON Java
作为所有类的顶层父类,没想到Object的魔力如此之大!
在上一篇博文中我们提到了Java面向对象的四大特性,其中谈及“抽象”特性时做了一个引子,引出今天的主人公Object,作为所有类的顶级父类,Object被视为是James.Gosling的哲学思考,它高度概括了事务的自然与社会行为。
90 13
|
6月前
|
C++
C++示例(电脑组装)展现C++多态的优势以及虚函数抽象类的应用
C++示例(电脑组装)展现C++多态的优势以及虚函数抽象类的应用
|
Java 编译器 C++
C++ :类 和 对象 ※重点※(三)
C++ :类 和 对象 ※重点※(三)
82 0
|
编译器 C++
C++ :类 和 对象 ※重点※(二)
C++ :类 和 对象 ※重点※(二)
74 0
|
编译器 C++
C++ :类 和 对象 ※重点※(一)
C++ :类 和 对象 ※重点※
45 0
|
存储 编译器 C++
C++继承和多态核心重点知识刨析,一文必拿下
C++继承和多态核心重点知识刨析,一文必拿下
C++继承和多态核心重点知识刨析,一文必拿下
|
Java 数据库 数据安全/隐私保护
规则之间-方法覆写限制 | 带你学《Java面向对象编程》之四十
本节向读者介绍了覆写方法过程中的一些限制,并拓宽读者对访问权限控制符的认识,帮助读者进行有效的方法覆写。