博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式之《适配器模式》及应用场景
阅读量:4160 次
发布时间:2019-05-26

本文共 3500 字,大约阅读时间需要 11 分钟。

出处地址

 

适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。

  适配器模式有两种:类适配器、对象适配器、接口适配器

  前二者在实现上有些许区别,作用一样,第三个接口适配器差别较大。

1、类适配器模式:

  原理:通过继承来实现适配器功能。

  当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后再继承接口B的实现类BB,这样我们可以在适配器P中访问接口B的方法了,这时我们在适配器P中的接口A方法中直接引用BB中的合适方法,这样就完成了一个简单的类适配器。

  详见下方实例:我们以ps2与usb的转接为例

ps2接口:Ps21 public interface Ps2 {

2 void isPs2();
3 }

USB接口:Usb1 public interface Usb {

2 void isUsb();
3 }

USB接口实现类:Usber1 public class Usber implements Usb {

2
3 @Override
4 public void isUsb() {
5 System.out.println("USB口");
6 }
7
8 }
适配器:Adapter1 public class Adapter extends Usber implements Ps2 {
2
3 @Override
4 public void isPs2() {
5 isUsb();
6 }
7
8 }
测试方法:Clienter1 public class Clienter {
2
3 public static void main(String[] args) {
4 Ps2 p = new Adapter();
5 p.isPs2();
6 }
7
8 }
显示结果:USB口

 

实例讲解:

  我手中有个ps2插头的设备,但是主机上只有usb插头的插口,怎么办呢?弄个转换器,将ps2插头转换成为USB插头就可以使用了。

  接口Ps2:描述ps2接口格式

  接口Usb:描述USB接口格式

  类Usber:是接口Usb的实现类,是具体的USB接口格式

  Adapter:用于将ps2接口格式转换成为USB接口格式

2、对象适配器模式

  原理:通过组合来实现适配器功能。

  当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后在适配器P中定义私有变量C(对象)(B接口指向变量名),再定义一个带参数的构造器用来为对象C赋值,再在A接口的方法实现中使用对象C调用其来源于B接口的方法。

  详见下方实例:我们仍然以ps2与usb的转接为例

ps2接口:Ps2

1 public interface Ps2 {2     void isPs2();3 }

USB接口:Usb

1 public interface Usb {2     void isUsb();3 }

USB接口实现类:Usber

1 public class Usber implements Usb {2 3     @Override4     public void isUsb() {5         System.out.println("USB口");6     }7 8 }

适配器:Adapter

1 public class Adapter implements Ps2 { 2      3     private Usb usb; 4     public Adapter(Usb usb){ 5         this.usb = usb; 6     } 7     @Override 8     public void isPs2() { 9         usb.isUsb();10     }11 12 }

测试类:Clienter

1 public class Clienter {2 3     public static void main(String[] args) {4         Ps2 p = new Adapter(new Usber());5         p.isPs2();6     }7 8 }

结果显示:

USB口

实例讲解:

  我手中有个ps2插头的设备,但是主机上只有usb插头的插口,怎么办呢?弄个转换器,将ps2插头转换成为USB插头就可以使用了。

  接口Ps2:描述ps2接口格式

  接口Usb:描述USB接口格式

  类Usber:是接口Usb的实现类,是具体的USB接口格式

  Adapter:用于将ps2接口格式转换成为USB接口格式

3、接口适配器模式

  原理:通过抽象类来实现适配,这种适配稍别于上面所述的适配。

  当存在这样一个接口,其中定义了N多的方法,而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们要对所有的方法进行实现,哪怕我们仅仅是对不需要的方法进行置空(只写一对大括号,不做具体方法实现)也会导致这个类变得臃肿,调用也不方便,这时我们可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有的方法都进行置空,那么我们在创建抽象类的继承类,而且重写我们需要使用的那几个方法即可。

目标接口:A

1 public interface A {2     void a();3     void b();4     void c();5     void d();6     void e();7     void f();8 }适配器:Adapter

 

1 public abstract class Adapter implements A {2     public void a(){}3     public void b(){}4     public void c(){}5     public void d(){}6     public void e(){}7     public void f(){}8 }

 

实现类:Ashili

 

1 public class Ashili extends Adapter {2     public void a(){3         System.out.println("实现A方法被调用");4     }5     public void d(){6         System.out.println("实现d方法被调用");7     }8 }

 

测试类:Clienter

 

1 public class Clienter {2 3     public static void main(String[] args) {4         A a = new Ashili();5         a.a();6         a.d();7     }8 9 }

 

4、适配器模式应用场景

类适配器与对象适配器的使用场景一致,仅仅是实现手段稍有区别,二者主要用于如下场景:

  (1)想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。

  (2)我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。

  以上两个场景其实就是从两个角度来描述一类问题,那就是要访问的方法不在合适的接口里,一个从接口出发(被访问),一个从访问出发(主动访问)。

接口适配器使用场景:

  (1)想要使用接口中的某个或某些方法,但是接口中有太多方法,我们要使用时必须实现接口并实现其中的所有方法,可以使用抽象类来实现接口,并不对方法进行实现(仅置空),然后我们再继承这个抽象类来通过重写想用的方法的方式来实现。这个抽象类就是适配器。

转载地址:http://qejxi.baihongyu.com/

你可能感兴趣的文章
一道技术问题引起的遐想,最后得出结论技术的本质是多么的朴实!
查看>>
985硕士:非科班自学编程感觉还不如培训班出来的,硕士白读了?
查看>>
码农:和产品对一天需求,产品经理的需求是对完了,可我代码呢?
查看>>
第六章 背包问题——01背包
查看>>
1136 . 欧拉函数
查看>>
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
JSP的内置对象及方法
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Spring MVC和Struts2的比较
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>