使用场景 实现方式
某些模块的输出不能直接匹配使用模块的格式,需要在中间增加一层 adapter 将输出转换为用户模块感兴趣的输入类型 定义 adapter 接口,按需转换为目标类型
项目中实践 最多的是 recyclerview 里面数据转换为对应的 holder 的应用

架构图

package com.example.xpj.adapters;

import com.example.xpj.DPConstants;

public class DPFoodFactory {
    // 食物生产者,每种类型只能生产自己擅长的食物
    public interface DPFood<T> {
        T produceFood();
    }

    public static class DPIntFood implements DPFood<Integer> {
        @Override
        public Integer produceFood() {
            return 2333;
        }
    }

    public static class DPLongFood implements DPFood<Long> {
        @Override
        public Long produceFood() {
            return 6666L;
        }
    }

    // adapter 的 接口,有两个泛型一个输入一个输出
    public interface DPAdapter<T, R> {
        R adapt(T t);
    }

    public static class DPInt2StringAdapter implements DPAdapter<Integer, String> {
        @Override
        public String adapt(Integer t) {
            return t.toString() + " im from Int. ";
        }
    }

    public static class DPLong2StringAdapter implements DPAdapter<Long, String> {
        @Override
        public String adapt(Long t) {
            return t.toString() + " im From Long. ";
        }
    }

    // 这里用户只能吃 String 的食物
    public static class DPAdapterUser {
        public void feedMe(String food) {
            DPConstants.PRTMsg("yes this food is i like! " + food + " thank you!!");
        }
    }

    public void testAdapter() {
        DPAdapterUser user = new DPAdapterUser();
        // 调用对应的 adapter 去转换为用户能够消化的食物
        user.feedMe(new DPInt2StringAdapter().adapt(new DPIntFood().produceFood()));
        user.feedMe(new DPLong2StringAdapter().adapt(new DPLongFood().produceFood()));
    }
}

总结

适配器模式用的最多的是 recyclerview 里面数据与 holder 的转换,自己常用的一种类似于 adapter 的是数据转换,就是在写首页的时候有一个 transform 模块,这个也是将输入转换为我们感兴趣的模块。