Java设计模式之适配器模式详解

1.什么是适配器模式?

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

2.适配器模式中的角色分析

  • 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

  • 需要适配的类(Adaptee):需要适配的类或适配者类。

  • 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

3.实现方式

1).类适配器(采用继承实现)

2).对象适配器(采用对象组合方式实现)

4.类适配器:

因为 Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口(因为 Java 不支持多继承,所以这样来实现)所以被称为类适配器

实例(以插网线上网举例):

1)首先我们拥有一根网线,他有上网的功能,但是它的接口与电脑不匹配

//要适配的类:网线
public class Adaptee {
    //功能:上网
    public void request(){
        System.out.println("链接网线上网");
    }
}

2)因此我们定义了一个usb接口,也就是上面提到的目标接口(Target)

//接口转换器的抽象实现
public interface NetToUsb {
    //作用:处理请求,网线=>usb
    public void handleRequest();
}
​

3)定义一个适配器继承着网线,连接着usb接口

//真正的适配器,余姚链接usb,连接网线
public class Adapter extends Adaptee implements NetToUsb {
​
    @Override
    public void handleRequest() {
        super.request();//可以上网了
    }
}

4)上网的具体实现

//客户端类:想上网,插不上网线
public class Computer {
    //电脑需要连接上转接器才可以上网
    public void net(NetToUsb adapter){
        //上网的具体实现:找一个转接头
        adapter.handleRequest();
    }
​
    public static void main(String[] args) {
        //电脑,适配器,网线
        Computer computer = new Computer();//电脑
        Adapter adapter = new Adapter();//转接器
        computer.net(adapter);//电脑直接连接转接器就可以
    }
}

5.对象适配器:

不是使用多继承或继承再实现的方式,而是使用直接关联,或者称为委托的方式

1)更改适配器为如下代码

public class Adapter2 implements NetToUsb {
    private Adaptee adaptee;
    public Adapter2(Adaptee adaptee){
        this.adaptee = adaptee;
    }
    @Override
    public void handleRequest() {
     adaptee.request();;//可以上网了
    }
}

2)此时的客户端中,转接器需要分别连接网线和电脑

//客户端类:想上网,插不上网线
public class Computer {
    //电脑需要连接上转接器才可以上网
    public void net(NetToUsb adapter){
        //上网的具体实现:找一个转接头
        adapter.handleRequest();
    }
​
    public static void main(String[] args) {
        //电脑,适配器,网线
        Computer computer = new Computer();//电脑
        Adaptee adaptee = new Adaptee();//网线
        Adapter2 adapter2 = new Adapter2(adaptee);//转接器
        computer.net(adapter2);
    }
}

6.总结:

推荐使用对象适配器

对象适配器的优点:

  • 一个对象适配器可以把多个不同的适配者适配到同一个目标

  • 可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据’里氏替换原则’适配者的子类也可以通过该适配器进行适配

类适配器的缺点 :

  • 对于java,c#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不同同时适配多个适配者

  • 在java,c#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性

使用场景:

  • 系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码

  • 像创建一个重复使用的类,用于与一些彼此之间没有太大联系的类,包括一些可能子啊将来一起工作的类

  • 比如GUI编程,springboot

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值