最近在学习JUC的相关类的源码的时候,看到了FutrueTask类中有使用到适配器模式,加之前段时间刚学习了设计模式,所以就了解了一下加深对适配器模式的理解。

简单解释一下适配器的思想:就是一个类不能被直接使用,就通过适配器将其转换为另一个类的过程。就像家庭电压为220V,但是手机充电是不能直接使用220V的交流电,需要通过电源适配器将其转换为5V的直流电才能直接使用,这个电源适配器就是适配器模式中的适配器。

直接上代码:

构造方法一:传入参数为Callable接口

    public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        this.callable = callable;
        this.state = NEW;       // ensure visibility of callable
    }

构造方法二:传入的参数为Runnable接口

	// 这是FutureTask的构造方法
    public FutureTask(Runnable runnable, V result) {
    	// 调用Executors类中的callable方法进行转化
        this.callable = Executors.callable(runnable, result);
        this.state = NEW;       // ensure visibility of callable
    }

看到Executors中 的方法

	// Executors类中的callable方法
    public static <T> Callable<T> callable(Runnable task, T result) {
        if (task == null)
            throw new NullPointerException();
        // 返回类型是Callable
        // 这里就开始使用适配器模式了
        return new RunnableAdapter<T>(task, result);
    }

在Executors中有一个内部类:即我们的适配器类

	// 实现了Callable接口
    static final class RunnableAdapter<T> implements Callable<T> {
        final Runnable task;
        final T result;
        // 传入Runnable接口(实现类)和返回值
        RunnableAdapter(Runnable task, T result) {
            this.task = task;
            this.result = result;
        }
        // 实现call()方法
        public T call() {
        	// 在call方法中调用Runnable实现类中的run()方法
        	// 变相实现了将Runnable转化为Callable的过程
            task.run();
            // 返回值(Callable接口的call方法有返回值)
            return result;
        }
    }

可以看到关键类RunnableAdapter类实现了一个巧妙的转换就将Runnable封装成了Callable。
同时可以看到这里使用的是类适配器模式,因为直接实现了Callable接口。(另外有对象适配器模式等)。
通过这么一个简单案例可以加深对适配器模式的理解。

posted on 2021-09-09 10:09  wuraoo  阅读(86)  评论(0编辑  收藏  举报