当前位置: 首页 > 编程笔记 >

初识Java设计模式适配器模式

管景天
2023-03-14
本文向大家介绍初识Java设计模式适配器模式,包括了初识Java设计模式适配器模式的使用技巧和注意事项,需要的朋友参考一下

【正文】

我们知道,Android中最重要也是最难用的UI控件就是ListView列表控件,而要想灵活运用它,则必须要用到适配器adapter,所以,我觉得还是很有必要来学习一下Java当中的适配器模式(不管以后能不能用到),毕竟Java语言是Android开发很重要的一个基础。 

完全了解适配器模式,有很多知识要学习,例如:适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。但作为初学者,我就简单学习一下配器模式入门知识吧,以后会不断完善。希望奋斗在码农路上的童鞋们莫吐槽→_→ 

一、适配器介绍

 •将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
 •适配器模式在现代的Java框架中十分常用。这种模式适用于以下场景:想使用一个已存在的类,但是该类不符合接口需求;或者需要创建一个可重用的类,适配没有提供合适接口的其它类。

二、苹果和桔子的例子 

适配器的思想可以通过下面这个简单的例子说明。这个示例要让一个桔子被“适配”成一个苹果。如下图所示:

上图中的下半部分可以看到,适配器包含了一个桔子实例并且继承了苹果类。桔子对象放在了适配器中,于是桔子表现得就像苹果一样了。对应的逻辑图如下:

三、插座盒插头的例子

上图中,我们可以通过中间的适配器让右边的插头成功连接上左边的插座。

四、插头适配器的代码实现

/**
  适配器模式( Adapter ):将一个类的接口转换成客户希望的另外一个接口。
  适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
*/
class AdapterDemo{
  public static void main(String[] args){
    //电源A开始工作
    PowerA powerA = new PowerAImpl();
    start(powerA);
    PowerB powerB = new PowerBImpl();
    PowerAAdapter pa = new PowerAAdapter(powerB);
    start(pa);
  }
  //定义方法:电源A工作
  public static void start(PowerA powerA){
    System.out.println("....一些重复的代码.....");
    powerA.insert();
    System.out.println("....一些重复的代码.....\n");
  }

  /**
  public static void start(PowerB powerB){
    System.out.println("....一些重复的代码.....");
    powerB.connect();
    System.out.println("....一些重复的代码.....");
  }
  */
}
//定义适配器类
class PowerAAdapter implements PowerA{
  private PowerB powerB;//要进行适配的接口
  
  public PowerAAdapter(PowerB powerB){
    this.powerB = powerB;
  }
  //实现接口PowerA,则必然要实现PowerA里面的方法
  public void insert(){
    powerB.connect();
  }
}
/**
  电源A接口
*/
interface PowerA{
  public void insert();
}
class PowerAImpl implements PowerA{
  public void insert(){
    System.out.println("电源A接口插入,开始工作");
  }
}
/**
  电源B接口
*/
interface PowerB{
  public void connect();
}
class PowerBImpl implements PowerB{
  public void connect(){
    System.out.println("电源B接口已连接,开始工作");
  }
}

在这个例子当中,我们想让PowerB调用PowerA中Start()方法里的代码;当然,我们也不想重复写被注释掉的23、25行代码。这个时候就可以用适配器模式。 

上述代码解释: 

第30行:开始定义适配器,也是核心代码的开始; 

第33、34行:通过构造方法将PowerB传进来; 

第37行代码:既然是实现接口PowerA,则必然要实现PowerA里面的方法insert(); 

第38行代码:我们在PowerA的insert()方法中,去调用PowerB的connect()方法; 

紧接着,第10、11、12行代码的意思是:在new一个PowerB的时候,我们把它传到适配器PowerAAdapter里面去,启动适配器,然后PowerB就会去执行第16、24、18行的代码。 

注:16、24、18这个顺序没有错,因为我们在适配器中相当于是已经将24行代码替换为了第17行代码。 

运行效果如下: 


同理,如果我也想把PowerA作为PowerB去使用,可以再定义一个适配器PowerBAdapter,实现双向适配器。

五、小总结

上方第23、25行被注释掉的代码,表示是很多重复的代码,不符合面向对象的思维方式。我们现在设想这样一个例子:我们的项目已经上线并且客户正在使用,但是后来增加了一些新的需求。而面向对象有一条OO原则就是:对修改关闭(上线后,代码尽量不要修改,不然可能会发生连锁反应,导致其他调用此处方法的代码都可能出问题),对扩展开放(自己定义的新的方法,别人还没有调用,我们当然可以修改)。此时,我们可以通过适配器来减少这些重复的代码。

六、OO设计原则

 •面向接口编程(面向抽象编程)
 •封装变化
 •多用组合,少用继承
 •对修改关闭 对扩展开放

个人感觉,这些设计原则,需要在实践中不断加深理解,在这里就不过多描述了哦~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍java设计模式之适配器模式,包括了java设计模式之适配器模式的使用技巧和注意事项,需要的朋友参考一下 感谢《Android源码设计模式解析与实战》 何红辉 关爱民 著  适配器模式在我们的开发中使用率极高,从代码中随处可见的Adapter就可以判断出来,从最早的ListView、GridView、到现在最新的RecyclerView都需要使用Adapter,并且在开发中我们遇到的

  • 1. 适配器(Adapter) Intent 把一个类接口转换成另一个用户需要的接口。 Class Diagram Implementation 鸭子(Duck)和火鸡(Turkey)拥有不同的叫声,Duck 的叫声调用 quack() 方法,而 Turkey 调用 gobble() 方法。 要求将 Turkey 的 gobble() 方法适配成 Duck 的 quack() 方法,从而让火鸡冒充

  • 介绍 适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作的那些类(对象)可以一些工作。速成包装器(wrapper)。 正文 我们来举一个例子,鸭子(Dock)有飞(fly)和嘎嘎叫(quack)的行为,而火鸡虽然也有飞(fly)的行为,但是其叫声是咯咯的(gobble)。如果你非要火鸡也要实现

  • 本文向大家介绍Java设计模式之适配器模式简介,包括了Java设计模式之适配器模式简介的使用技巧和注意事项,需要的朋友参考一下 本文举例说明两种适配器模式,即类适配模式和对象适配模式,详情如下: 1.类适配模式: 举个例子来说明:在地球时代,所有坐骑都是只能跑,不能飞的,而现在很多坐骑在地球都可以飞了。假设,地球时代的坐骑只能跑,而现在的坐骑不仅能飞还能跑,我们可以用类适配模式来实现。 这里需要注

  • 本文向大家介绍Android设计模式之适配器(Adapter)模式,包括了Android设计模式之适配器(Adapter)模式的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android适配器模式源码,供大家参考,具体内容如下 1. 模式介绍 1.1模式的定义:   适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

  • 本文向大家介绍JavaScript设计模式之适配器模式介绍,包括了JavaScript设计模式之适配器模式介绍的使用技巧和注意事项,需要的朋友参考一下 适配器模式说明 说明: 适配器模式,一般是为要使用的接口,不符本应用或本系统使用,而需引入的中间适配层类或对象的情况; 场景: 就好比我们买了台手机,买回来后发现,充电线插头是三插头,但家里,只有两插头的口的插座,怎么办?为了方便,也有为能在任何地