43

设计模式之适配器模式

 6 years ago
source link: http://coderlengary.github.io/2018/08/08/DesignModeAdapter/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

适配器模式指的是将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。

适配器模式下有以下角色:

  • Source:资源,即需要被适配的对象
  • Adaper:适配器,负责将Source转换成我们想要的输出,即Destination
  • Destination:我们想要的最终输出

一句话来描述适配器模式:Source->Adaper->Destination

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

使用场景:

  1. 系统需要使用现有的类,但现有的类却不兼容。
  2. 需要建立一个可以重复使用的类,用于一些彼此关系不大的类,并易于扩展,以便于面对将来会出现的类。
  3. 需要一个统一的输出接口,但是输入类型却诗不可预知的。

类适配器模式

Adapter类,通过继承Source类,实现Destination 类接口,完成src->dst的适配。

举个例子,日常生活中的手机充电,Source就是电网的220V交流电,Destination就是5V直流电,充电器就是Adaper

Source类

public class Voltage220 {
  public int output220V(){
    int src = 220;
    System.out.println("Source is "+src+" V");
    return src;
  }
}

Destination接口:

public interface Voltage5{
  int output5V();
}

适配器类:

public Adaper extends Voltage220 implements Voltage5{
  @Override
  public int output5V(){
    int source = output220V();
    int result = source/44;
    return result;
  }
}

对象适配器模式

Adapter类,通过持有Source类,实现Destination 类接口,完成src->dst的适配。

适配器类:

public Adaper implements Voltage5{
  private Voltage220 voltage220;

  public Adapter(Voltage220 voltage220){
    this.voltage220 = voltage220;
  }
  @Override
  public int output5V(){
    int result = 0 ;
    if(voltage220!=null){
      int source = voltage220.output220V();
      result = source/44;
    }
    return result;
  }
}

写Android的朋友看到这个是不是很熟悉,没错,就是RecyclerView的Adapter,还记得怎么写吗?

public class MyRecyclerViewAdapterextends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<String> list;

    public MyAdapter(List<String> list) {
        this.list = list;
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_base_use, parent, false);
        MyAdapter.ViewHolder viewHolder = new MyAdapter.ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
        holder.mText.setText(list.get(position));
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        TextView mText;
        ViewHolder(View itemView) {
            super(itemView);
            mText = itemView.findViewById(R.id.item_tx);
        }
    }
}

你看,这个Adapter就是采用持有Source对象的形式,也就是对象适配器模式。在这个Adapter中,Source是数据源,也就是list,而Destination呢?当然就是我们Recycler中每一项的View啊。也就是说RecyclerView.Adapter完成了数据源->Adapter->View的转变,这就是它存在的意义。我们知道有数据源,但数据源多种多样,有人会塞文字进去,有人会塞图片。但是它们最后产物一定是一个View,这就是使用场景3的情况:需要一个统一的输出接口,但是输入类型却是不可预知的。

接口适配模式

在日常开发中,常常会遇到这种情况,我们定义了一个接口,接口中有很多方法,但我们没必要全都实现。这时怎么办呢,我们怎样把这个接口转化成我们需要的呢(即选择性实现接口的方法)。这个时候,Source就是接口,Adapter需要实现这个接口,成为一个抽象类,那么我们在创建抽象类的继承类,只需要重写我们需要使用的那几个方法即可。

Source接口:

public interface ILetter{
  void A();
  void B();
  void C();
  void D();
  void E();
  void F();
}

适配器类:

public abstract Adapter implements ILetter{
  @Override
  public void A(){
    System.out.println("打印字母A");
  }
  @Override
  public void B(){
    System.out.println("打印字母B");
  }
  @Override
  public void C(){
    System.out.println("打印字母C");
  }
  @Override
  public void D(){
    System.out.println("打印字母D");
  }
  @Override
  public void E(){
    System.out.println("打印字母E");
  }
  @Override
  public void F(){
    System.out.println("打印字母F");
  }
}

使用方式,只实现ILetter接口中我需要的方法

//方式1
public class Printer extends Adapter{
  @Override
  public void F(){
    System.out.println("不要打印字母F");
  }
}

//方式2
new Adapter(){
  @Override
  public void F(){
    System.out.println("不要打印字母F");
  }
}

总结

类适配器,以 类 给到,在Adapter里,就是将source当做类,继承,

对象适配器,以 对象 给到,在Adapter里,将source作为一个对象,持有。

接口适配器,以 接口 给到,在Adapter里,将source作为一个接口,实现。(转化接口)


Recommend

  • 113

    Scala 与设计模式(五):Adapter 适配器模式 11月20日 | by Prefert...

  • 67

    适配器模式(Adapter)是23种设计模式之一。DP中是这么定义外观模式的:适配器模式将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。我们生活中就经常使用到适配器,适配器这个词最早应该...

  • 50
    • www.sunnyang.com 6 years ago
    • Cache

    Java设计模式-适配器模式

    适配器模式是23种设计模式中比较常用的模式之一,在创建型模式、结构性模式和行为型模式分类中,适配器模式归类为结构型模式。 将一个类的接口转换成客户希望的另外一个接口。 Adapter模式使得原本由于接口不兼容而不能一起工作...

  • 37

    作者:Andrew Jaffee, 原文链接 ,原文日期:2018-09-04 译者: 郑一一 ;校...

  • 58
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    Python 设计模式-适配器模式

  • 53
    • www.tuicool.com 5 years ago
    • Cache

    Java设计模式——适配器模式

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mingyunxiaohai/article/details/91358243 适配器模式是将一个类的接口转换成开发者希望的另一个接口 下面参考Retrofit的...

  • 46
    • www.hi-roy.com 5 years ago
    • Cache

    设计模式-适配器模式

    适配器模式目的就是不改变原有系统的基础上保留其提供的服务,向调用者提供新的接口服务,使得原本由于接口不兼容而不能一起工作的类可以一起工作。(简单说就是增加兼容性,复用已经存在的功能) 笔记本电脑的电源变压器就是这个...

  • 19

    在实际生活中,也存在适配器的使用场景,比如:港式插头转换器、电源适配器和 USB 转接口。 而在软件工程中,适配器模式的作用是解决两个软件实体间的接口不兼容的问题。 使用适配器模式之后,原本由于接口不兼容而不能工作...

  • 27
    • segmentfault.com 4 years ago
    • Cache

    7. 设计模式-适配器模式

    生活中的例子 如上图所示,生活中适配器无处不在,如电源适配器,读卡器,甚至多转接头读卡器等,都是很常见的...

  • 8
    • jiajunhuang.com 4 years ago
    • Cache

    Go设计模式:适配器模式

    Go设计模式:适配器模式 我买过一个港版的手机,香港的插座和大陆不一样,电压也不一样,因此为了充电,我还买了一个转换头,这个转换头,就是起的 适配器的使用。 原本,大陆插座是两个孔的;而香港的是三个孔,也就是说我手机是没有办法充...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK