适配器模式

本文深入探讨了适配器模式的原理与应用,通过实例解释如何将不兼容接口的类进行适配,使其能协同工作。同时,分析了FutureTask源码中适配器模式的应用,展示了从Runnable到Callable的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是适配器模式?
     – 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

生活中的场景

 模式中的角色
     – 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
     – 需要适配的类(Adaptee):需要适配的类或适配者类。
     – 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。 

可以解决下面因为接口不兼容为引起的问题

使用适配器之后:

     所以我们可以知道适配器模式:

                1.创建一个适配器的类

                2.适配器的类中需要有被适配器对象的引用,即哪个类需要被适配。

                3.适配器需要实现一个接口,这个接口是我们想要的类型的接口,

     具体的代码实现:

     目标接口:

public interface Target {
    void handle();
}
/*
* 被适配的类
* (相当于例子中的,PS/2键盘)
* */
public class Adaptee {
    public void request(){
        System.out.println("可以完成客户请求的需要的功能!");
    }
}

  适配器类的的定义:

/*
* 适配器(类适配器方式)
* (相当于usb和ps/2的转接器)
* */
public class Adapter implements Target{
    private Adaptee adaptee;//被适配器对象的引用

    public Adapter(Adaptee adaptee) {//传入需要适配的对象
        this.adaptee = adaptee;
    }

    @Override
    public void handle() { //其实也是调用被适配器的方法
        adaptee.request();
    }
}

    模拟使用:

/*
* 客户端
* (相当于例子中的笔记本,只有USB接口)
* 需求:有一个笔记本和键盘,但是笔记本的usb接口和键盘的接口不匹配
*       这时就需要一个转接口,进行适配
* */
public class Client {
    public static void main(String[] args) {
        Client c=new Client();

        Adaptee adaptee=new Adaptee();
        Target t=new Adapter(adaptee);

        c.test1(t);
    }

    public void test1(Target t){
        t.handle();
    }
}

     

       接下来,让我们分析一下FutureTask的源码说一下适配器模式,关于FutureTask是关于多线程并发方面的知识,这里不是我们的重点,不知道也不影响对适配器模式的理解。

public class FutureTask<V> implements RunnableFuture<V> {
   private volatile int state;
   private Callable<V> callable;  //在FutureTask中有一个Callable的成员变量
   public FutureTask(Callable<V> callable) {
       if (callable == null)
           throw new NullPointerException();
       this.callable = callable;
       this.state = NEW;       // ensure visibility of callable
   }
   public FutureTask(Runnable runnable, V result) {
       this.callable = Executors.callable(runnable, result);
       this.state = NEW;       // ensure visibility of callable
   }
}

        这里我仅贴出部分源码,在FutureTask类中,有一个Callable的成员变量成员变量,但现在我们有一个需求,让这个成员变量不仅能够接受Callable类型的对象,还能接受Runnable类型的对象,这就需要用到适配器模式了。

        我们知道Callable和Runnable是两个不同类型的接口,他们的子类也不相同,贴出源码:

        Runnable接口:

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

        Callable接口:

@FunctionalInterface
public interface Callable<V> {
    V call() throws Exception;
}

       再看上面的FutureTask的两个构造器,一个传入的是Callable类型的对象,一个是Runnable类型的对象,我们的目的是把Runnable类型的对象转化为Callable类型的对象,上面有这一句this.callable = Executors.callable(runnable, result);我们跟进去看一下 Executors.callable(runnable, result)的方法。

    public static <T> Callable<T> callable(Runnable task, T result) {
        if (task == null)
            throw new NullPointerException();
        return new RunnableAdapter<T>(task, result);  //适配器
    }

        这时可以看到返回的是RunnableAdapter类型,它将Runnable转化为Callable,我们再次跟进RunnableAdapter<T>(task, result)看一看

    static final class RunnableAdapter<T> implements Callable<T> {
        final Runnable task;
        final T result;
        RunnableAdapter(Runnable task, T result) {
            this.task = task;
            this.result = result;
        }
        public T call() {
            task.run();
            return result;
        }
    }

        我们可以看到这是一个典型的适配器,1.实现目标接口  2.有一个需要被适配对象的引用, 3.构造器传入这个需要被适配的对象,然后调用Callable方法,在里面调用Runnable接口的方法。

 

 

内容概要:该论文聚焦于T2WI核磁共振图像超分辨率问题,提出了一种利用T1WI模态作为辅助信息的跨模态解决方案。其主要贡献包括:提出基于高频信息约束的网络框架,通过主干特征提取分支和高频结构先验建模分支结合Transformer模块和注意力机制有效重建高频细节;设计渐进式特征匹配融合框架,采用多阶段相似特征匹配算法提高匹配鲁棒性;引入模型量化技术降低推理资源需求。实验结果表明,该方法不仅提高了超分辨率性能,还保持了图像质量。 适合人群:从事医学图像处理、计算机视觉领域的研究人员和工程师,尤其是对核磁共振图像超分辨率感兴趣的学者和技术开发者。 使用场景及目标:①适用于需要提升T2WI核磁共振图像分辨率的应用场景;②目标是通过跨模态信息融合提高图像质量,解决传统单模态方法难以克服的高频细节丢失问题;③为临床诊断提供更高质量的影像资料,帮助医生更准确地识别病灶。 其他说明:论文不仅提供了详细的网络架构设计与实现代码,还深入探讨了跨模态噪声的本质、高频信息约束的实现方式以及渐进式特征匹配的具体过程。此外,作者还对模型进行了量化处理,使得该方法可以在资源受限环境下高效运行。阅读时应重点关注论文中提到的技术创新点及其背后的原理,理解如何通过跨模态信息融合提升图像重建效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值