Java 23中设计模式之适配器模式

一:介绍
适配器模式(Adapter)把一个类的接口变换成客户端所期待的另一种接口,从而使原来因接口不匹配而无法在一起工作的两个类能够放在一起工作。
用电器来打个比喻:有一个电器的插头是三脚的,而现有的插座是两孔的,要使插头插上插座,我们需要一个插头转换器,这个转换器即是适配器。
二:模式角色
适配器模式有以下角色:

   1.Target(目标):这就是所期待得到的接口
   2.Adaptee(源):现有需要适配的接口
   3.Adapter(适配器):适配器类是本模式的核心,适配器把Adaptee转换成Target.

三:模式结构图
1.类的适配器模式结构图
image.png
2.对象的适配器模式结构图
image.png
四:模式实现
1.类的适配器模式

/**用户期待的目标接口*/
public interface Target {
    void doSomething1();
    //Adaptee中没有的方法,用户期待的目标接口doSomething2()
    void doSomething2();
}

//源业务做得事情
public class Adaptee {
    public void doSomething1() {
        // 业务逻辑,源业务做的事情
    }
}

/**类适配器模式*/
public class Adapter extends Adaptee implements Target {
    // Adaptee中没有方法doSomething2,因此适配器类补充此方法
    @Override
    public void doSomething2() {
        //业务逻辑,适配的接口需要做的事情
    }
}


//使用
 Adapter adapter=new Adapter();
        adapter.doSomething2();//通过适配增加的接口
        adapter.doSomething1();

2.对象适配器模式

/**用户期待的目标接口*/
public interface Target {
    void doSomething1();
    //Adaptee中没有的方法,用户期待的目标接口doSomething2()
    void doSomething2();
}

//源业务做得事情
public class Adaptee {
    public void doSomething1() {
        // 业务逻辑,源业务做的事情
    }
}

/**对象适配器模式*/
public class Adapter  implements Target {
    private Adaptee adaptee;
    public Adapter(Adaptee adaptee){
        this.adaptee=adaptee;

    }
    @Override
    public void doSomething1() {
        adaptee.doSomething1();
        
    }

    // Adaptee中没有方法doSomething2,因此适配器类补充此方法
    @Override
    public void doSomething2() {
        //业务逻辑,适配的接口需要做的事情
    }
}

//使用,通过构造方法传入对象
  Adapter adapter=new Adapter(new Adaptee());
        adapter.doSomething2();
        adapter.doSomething1();

3.接口适配器模式:也叫缺省适配器模式
主要解决接口的复用问题:有时候可能我们的业务仅仅须要使用接口中的某一个方法而不是所有方法。可是因为接口的语言特性而 不得不实现所有的抽象方法。这样就会使得接口的使用过程非常麻烦,特别是接口中存在非常多抽象方法的时候。面对接口的这类问题。我们能够採用一个抽象类(也可 以不是抽象类)去实现接口
4.Android源码中的适配器模式
image.png
从上图可以看出,BaseAdapter 是一个基础适配器,下面子类是具体各自的适配器,这些适配器的作用就是把数据 List<T>,Cusor 等转化成 ListAdapter 接口,最终让客户端 ListView 来调用「可以通俗的说就是把数据适配到 View 上面」

//对象适配器模式
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
//源数据
public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }
 public int getViewTypeCount() {
        return 1;
    }
    //目标接口
public boolean isEnabled(int position) {
        return true;
    }
}
//目标接口
public interface ListAdapter extends Adapter{
boolean isEnabled(int position);
}
public interface Adapter {
     int getCount();

    Object getItem(int var1);

    long getItemId(int var1);

    boolean hasStableIds();

    View getView(int var1, View var2, ViewGroup var3);

    int getItemViewType(int var1);

    int getViewTypeCount();

    boolean isEmpty();
}

小“姿势”
VGA:VGA接口与连接的电缆,但通常指VGA接口,也叫D-Sub接口
image.png
HDMI :高清晰度多媒体接口
image.png

结尾:活学活用


Rocky_ruan
57 声望5 粉丝

不积跬步,无以至千里