设计模式(四)-适配器模式

本文介绍了适配器模式,它能将一个类的接口转换为客户期望的接口,使不兼容的类一起工作,分为类和对象适配器模式。文中给出对象适配器模式代码实现,还阐述其在Spring MVC中对handler处理的应用,可解决分支判断复杂等问题。

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

适配器模式是什么?

适配器模式(Adapter),将一个类的接口转换为客户希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

举一个例子:手机和电脑使用的都是固定的较低的电压,但是我们使用的生活电压都是220v的,于是就需要一个电源适配器来将220v的电压转换为手机电脑需要的低电压,这个电源适配器的作用原理就是适配器模式的原理。

在GoF的设计模式中,适配器模式分为类适配器模式和对象适配器模式。类适配器模式是通过多重继承实现接口匹配,但由于java不支持多继承,所以,以下只展示对象适配模式的实例代码。

当想复用现有的某个类,但接口又不符时,应考虑使用适配器模式。

适配器模式结构图
适配器模式结构图
适配器模式的代码实现: show code …

Taget ,客户所期待的接口,可以是一个具体类,也可以是抽象类或接口

/**
 * @Author DevinLei
 */
public class Target {

    public void request(){
        System.out.println("");
    }
}

Adaptee ,需要适配的类

/**
 * @Author DevinLei
 */
public class Adaptee {

    public void specificRequest(){
        System.out.println("现接口");
    }
}

Adapter,适配器类,通过内部包装Adaptee类,将原接口装换为目标接口

/**
 * @Author DevinLei
 */
public class Adapter extends  Target {

    private  Adaptee adaptee = new Adaptee();

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

Client,对客户端来说,调用的就是期望的接口

/**
 * @Author DevinLei
 */
public class Client {

    public static void main(String[] args) {
        Target target = new Target();
        target.request();
    }
}

适配器模式的实际应用:
springmvc中对handler的处理使用了适配器模式。
springmvc通过HandlerMapping获取到可以处理的handler,这些handler的类型各不相同,对请求的预处理,参数获取都不相同,最简单的做法是根据不同的handler类型,做一个分支处理,不同的handler编写不同的代码。
这样的问题是很明显的,分支判断复杂,代码庞大,不符合单一职责原则。如果要增加一种handler类型,需要修改代码增加分支处理,违反了开闭原则。DispatcherServelt与多个handler发生了交互,违反迪米特法则。

而使用适配器模式,就可以很好的解决这个问题:
不直接对handler进行处理,而是将handler交给适配器HandlerAdapter去处理,这样DispatcherServlet交互的类就只剩下一个接口,HandlerAdapter,符合迪米特法则,尽可能少的与其他类发生交互;
将handler交给HandlerAdapter处理后,不同类型的handler被对应类型的HandlerAdapter处理,每个HandlerAdapter都只完成单一的handler处理,符合单一职责原则;
如果需要新增一个类型的handler,只需要新增对应类型的HandlerAdapter就可以处理,无需修改原有代码,符合开闭原则。
这样,不同的handler的不同处理方式,就在HandlerAdapter中得到了适配,对于DispatcherServlet来将,只需要统一的调用HandlerAdapter的handle()方法就可以了,无需关注不同handler的处理细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值