Java适配器模式

x33g5p2x  于2021-09-28 转载在 Java  
字(2.9k)|赞(0)|评价(0)|浏览(412)

适配器简介

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

应用实例: 1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。

优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

先看一段代码

  1. public void show(Usb_Inter usb){
  2. usb.start();
  3. }

从这个方中我们可以看出来 参数必须传入 Usb接口/他的实现类

笔记本电脑的usb接口只能插入usb接口的设备,现在我想把非usb接口的投影器插进去怎么办呢? 可以用一个适配器 看图

因为连个接口不一致导致无法使用投影器,而我们想使用USB接口的服务,就应该把投影器接口转换USB接口 , 这时候就需要适配器了 ,也可以叫中间件

可能了解过代理模式的 朋友会发现 适配器模式和代理模式的原理差不多啊!

那么他们的区别是什么呢

区别:很明显,适配器模式,由于旧接口不可能进行修改,因此为了还能继续使用旧接口,我们就需要将新接口利用适配器转换成旧接口

但是代理模式不一样,它使用的接口与原本接口是一样的,并未进行改变,主要功能是通过代理的这一层,能够对委托类做一些通用处理(如:日志,异常处理)。实现通用代码 和 逻辑代码分离 ,使代码耦合度降低

适配器有两种方式

  1. 属性适配器
  2. 继承适配器

在我看来 属性适配器比继承好用因为java是单继承 如果我要适配多设备呢 岂不是要创建多个适配器?

适配器模式的使用场景

适配器模式是一种补救模式,典型的应用场景就是我们开发好的程序,由于考虑不周到,或者需求变更,需求升级,需要修改某些接口,这时候可以使用适配器模式让我们的系统只需要最少的修改,带来最小的影响。

属性适配器(常用)

  1. public interface Usb_Inter { //电脑的Usb接口
  2. void start();//启动设备
  3. }
  1. public class Mouse implements Usb_Inter {//鼠标
  2. @Override
  3. public void start() {
  4. System.out.println("鼠标连接成功了");
  5. }
  6. }
  1. public class test {
  2. //调用接口方法
  3. public void show(Usb_Inter usb){
  4. usb.start();
  5. }
  6. @Test
  7. public void show1(){
  8. show(new Mouse()) ;
  9. }
  10. }

鼠标连接成功了

这时候我需要连接投影器 因为接口不同所以我们需要写一个适配器让他们接口相同 能传入show(Usb_Inter usb) 参数里

  1. public interface Projector_Inter {//投影器 接口
  2. void Pro_start();//投影器启动
  3. }
  1. public class Projector implements Projector_Inter {
  2. @Override
  3. public void Pro_start() {
  4. System.out.println("投影器连接成功");
  5. }
  6. }

适配器:

  1. public class Adapter implements Usb_Inter { //适配器
  2. private Projector projector;
  3. public Adapter(Projector projector) {
  4. this.projector = projector;
  5. }
  6. @Override
  7. public void start() {
  8. if (projector!=null){
  9. projector.Pro_start();
  10. }
  11. }
  12. }
  1. public class test {
  2. //调用接口方法
  3. public void show(Usb_Inter usb){
  4. usb.start();
  5. }
  6. @Test
  7. public void show2(){
  8. show(new Adapter(new Projector()));
  9. }
  10. }

投影器连接成功

看出来了没 成功的将非Usb接口的设备关联到Usb接口中了

继承适配器

尽量不要使用 继承适配器 因为 java是单继承 如果后期需要继承父类 那么就麻烦了

和属性的原理一样

  1. public interface Usb_Inter { //电脑的Usb接口
  2. public void start();//启动设备
  3. }
  1. public class Mouse implements Usb_Inter {//鼠标
  2. @Override
  3. public void start() {
  4. System.out.println("鼠标连接成功了");
  5. }
  6. }
  1. public class test {
  2. //调用接口方法
  3. public void show(Usb_Inter usb){
  4. usb.start();
  5. }
  6. @Test
  7. public void show1(){
  8. show(new Mouse()) ;
  9. }
  10. }

鼠标连接成功了

这时候我需要连接投影器 因为接口不同所以我们需要写一个适配器让他们接口相同能传入show(Usb_Inter usb) 参数里

  1. public interface Projector_Inter {//投影器 接口
  2. public void Pro_start();//投影器启动
  3. }
  1. public class Projector implements Projector_Inter {
  2. @Override
  3. public void Pro_start() {
  4. System.out.println("投影器连接成功");
  5. }
  6. }

适配器:

  1. public class Adapter_projector extends Projector implements Usb_Inter { //投影器
  2. @Override
  3. public void start() {
  4. super.Pro_start();
  5. }
  6. }
  1. public class test {
  2. //调用接口方法
  3. public void show(Usb_Inter usb){
  4. usb.start();
  5. }
  6. @Test
  7. public void show2(){
  8. show(new Adapter(new Projector()));
  9. }
  10. }

投影器连接成功

看出来了没 成功的将非Usb接口的设备关联到Usb接口中了

相关文章

最新文章

更多