【java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想

JDK源码的类定义

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

可以发现LinkedHashMap extends HashMap已经被动实现了Map,
为什么还需要主动 implements Map
以下将自己建立接口,模仿业务逻辑,从设计的角度分析这个问题

自己重现JDK设计

理清楚类的关系,去考虑自己设计这种类应该注意什么方面

建立 LinkedHashMap 的依赖关系

public interface Map {
    public void get();
}
public class HashMap implements Map {
    @Override
    public void get() {
        System.out.println("HashMap实现Map接口的方法");
    }
}

LinkedHashMap 不主动实现 Map

public class LinkedHashMap extends HashMap {
    @Override
    public void get() {
        System.out.println("linkedHashMap的get方法");
    }
}

使用自建的 LinkedHashMap

public class MyApplication {

	/**
     * @param map 多态的实现,可以传入LinkedHashMap 或者HashMap
     */
    private static void doMapAction(Map map){
        map.get();
    }
    
    public static void main(String[] args) {
        LinkedHashMap linkedHashMap = new LinkedHashMap();
        doMapAction(linkedHashMap);
    }
}

遇到重构任务

  • 任务:HashMap 要进行升级,HashMap implements Map 修改成 HashMap implements SuperMap

重构出现问题

  • 问题:修改HashMap实现,doMapAction会报错
        LinkedHashMap linkedHashMap = new LinkedHashMap();
        doMapAction(linkedHashMap); // 报错,方法声明为Map, linkedHashMap不再是Map的多态实现

解决问题

解决以上的问题,其实很简单,只需要把LinkedHashMap的类定义主动实现Map
public class LinkedHashMap extends HashMap implements Map

结论

从两种设计的类图来看:
public class LinkedHashMap extends HashMap
【java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想_第1张图片
public class LinkedHashMap extends HashMap implements Map
【java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想_第2张图片
doMapAction(Map map)的业务逻辑兼容HashMap的改动
【java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想_第3张图片
implements Map 的设计思想就是把Map 作为 LinkHashMap直接依赖
从工具类的语义上,方法doMapAction(Map map) 不用关心HashMap 类的设计,是一种解耦。

你可能感兴趣的:(源码,设计模式,java)