前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >万能转接头之适配器模式

万能转接头之适配器模式

作者头像
陈琛
发布2020-06-12 16:18:01
5330
发布2020-06-12 16:18:01
举报
文章被收录于专栏:陈琛的Redis文章

引言

如果咱要出国旅游,其他国家插座有采用欧标(两孔圆),而国内的插头都是两孔扁的,即无法使用,那不是凉凉了。在日常生活中,这个问题很好解决,我们只要带上多功能转化插头就ok啦,其类似于适配器。

这个例子是生活中的,那替换到代码是什么样呢?比如我们有一个类A,其有一个方法m1,也有一个类B,其也有一个方法m2,但是这两个类的参数完全不一样。我如果想要在m1方法中使用m2方法怎么办呢?其实方法可以类似,我们也弄一个转接插头,新建一个Adapter,在其里面完成两者的调用。

什么是适配器模式?

概念

将某个类的接口转化成客户端期望的另一个接口,主要目的是兼容性,让原本因接口不匹配不能工作的两个类可以协同工作。

需要注意的是,在设计之初尽量不要考虑这种设计模式,会使得本来很简单的代码或逻辑变得复杂冗余。我们一般在项目后期,动代码需要考虑的事情太多,容易出错的时候,可以考虑这种设计模式,使得代码改起来比较方便且不易犯错。

分类

适配器主要有三种呈现形式,分别是:

类适配器(通过继承插座类,实现插头接口,完成插座到插头的转化)

对象适配器(持有插座类,实现插头接口,完成插座到插头的转化)

接口适配器

类适配器

基本介绍

继承插座类,实现插头接口,完成插座到插头的转化。

思路分析

实际代码

有了uml图,代码就很简单了,来溜溜代码吧。

插头接口:

代码语言:javascript
复制
public interface IPlug {
  public int output5V();
}

插座接口:

代码语言:javascript
复制
public class Socket { 
  public int output220V(){ 
    System.out.println("电源电压220V");
    return 220;
 } 
}

多功能转接头(适配器):

代码语言:javascript
复制
public class Adapter extends Socket implements IPlug { 
  @Override 
  public int output5V() { 
    System.out.println("进入适配器,即多功能转接头");
    int output220V=output220V();
    int output5V=output220V/44;
    return output5V; 
} 
}

调用方:

代码语言:javascript
复制
public class Phone { 
  public void work(IPlug iPlug){ 
    System.out.println("当前电压:"+iPlug.output5V());
 } 
}
代码语言:javascript
复制
public class Client { 
  public static void main(String[] args){ 
    Phone phone=new Phone(); 
    phone.work(new Adapter());
 } 
}

调用结果:

缺点

由于转接头类Adapter继承了插座类Socket,在之前的设计模式七大原则中“里氏替换原则”就说明了少用继承,继承使得代码耦合性加强,以后不利于改代码。所以我们针对上面的缺点,提出了对象适配器。

对象适配器

基本介绍

针对类适配器中的继承关系做了一些调整,根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系,即使用插座对象,将继承关系转化为has关系,实现插头接口,完成插座到插头的转化。

实际代码

由于这个和类适配器类似,只有Adapter代码不一样,所以其他类就不写了。

代码语言:javascript
复制
public class Adapter implements IPlug { 
  private Socket socket ; 
  public Adapter(Socket socket){ 
    this.socket=socket; 
  } 
 @Override 
  public int output5V() {  
     System.out.println("进入适配器,即多功能转接头"); 
     int output220V = socket.output220V(); 
     int output5V = output220V / 44; 
     return output5V; 
}
}

代码语言:javascript
复制
public class Client { 
 public static void main(String[] args){ 
  Phone phone=new Phone(); 
  phone.work(new Adapter(new Socket()));
 }
}

优点

对象适配器和类适配器其实算是同一种思想,只不过实现方式不同。

根据合成复用的原则,使用组合替代继承,使用成本更低,更加灵活。

接口适配器(缺省适配器模式)

基本介绍

当不需要全部实现接口提供的方法时,先设计一个实现某接口的类,并为该接口中的每个方法提供一个默认实现,当子类不想使用所有方法的情况下,就可以选择性的覆盖父类方法完成需求。

代码实现

代码语言:javascript
复制
public interface ceshi {
 public void m1(); 
 public void m2();
 public void m3(); 
 public void m4(); 
}
代码语言:javascript
复制
public class Client { 
  public static void main(String[] args) { 
    Adapter adapter = new Adapter() { 
              public void m1() { //只需要覆盖我们使用的接口方法 
                  System.out.println("m1");
              }
    }; 
    adapter.m1();
 }
}

运行结果:

优点

1.没有不符合系统的需求,通过适配器解决不兼容的问题,使得这些功能类得到复用。

2.在一定程度上的解耦。

缺点

过多的使用适配器,增加系统的理解难度。

结语

本文主要介绍了三种适配器模式,本质上是现有的不兼容的接口转换为需要的接口,既不需要改变原来的代码结构即可实现新的功能。

类适配器模式,以继承现有类的方式转换。

对象适配器模式,以聚合对象实例的方式转换。

接口适配器模式,以实现接口的方式转换。

适配器模式是在现有的类和系统都不易修改的情况下使用,在系统设计之初慎用适配器模式,这样会导致代码可读性变差,不易维护。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 学习Java的小姐姐 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 什么是适配器模式?
    • 概念
      • 基本介绍
        • 思路分析
          • 实际代码
            • 缺点
            • 对象适配器
              • 基本介绍
                • 优点
                • 接口适配器(缺省适配器模式)
                  • 基本介绍
                    • 代码实现
                      • 优点
                        • 缺点
                        • 结语
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档