星星博客 »  > 

5、适配器模式

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
用对象适配器好过类适配器

1.类适配器

package com.yuan;

import sun.nio.ch.Net;

/**
 * @author QLBF 演示适配器模式
 * @version 1.0
 * @date 2021/5/28 19:23
 */
//要被适配的类:网线
class Adaptee{
    public void request(){
        System.out.println("连接网线上网");
    }
}
//接口转换器的抽象实现~
interface NetToUsb{
    //作川:处理请求,网线=>usb
    public void handleRequest();

}

//真正的适配器,需 要连接USB,连接网线~
//现在演示用类适配器
class Adapter extends Adaptee implements NetToUsb{

    @Override
    public void handleRequest() {
        //上网的具体实现,找一个转接头
        super.request();
    }
}

//客户端关: 想上:网,插不L:网线~
public class Computer {
    //我们的电脑需要连接1:转按器才可以上网
    public void net(NetToUsb adapter){
        //.上网的具体实现, 找“个转接义
        adapter.handleRequest();
    }
    public static void main(String[] args) {
        //电脑,适配器,网线~
        Computer computer=new Computer();
        Adaptee adaptee=new Adaptee(); //网线
        Adapter adapter=new Adapter(); //转换器,把网线转为usb
        computer.net(adapter);
    }
}

在这里插入图片描述

下面演示对象适配器(其实只有Adapter何main有点不同而已)

聚合就是用了类适配器模式
组合就是用了对象适配器模式

2.对象适配器

package com.yuan;

import com.sun.xml.internal.ws.api.server.Adapter;
import sun.nio.ch.Net;

/**
 * @author QLBF 演示适配器模式
 * @version 1.0
 * @date 2021/5/28 19:23
 */
//要被适配的类:网线
class Adaptee{
    public void request(){
        System.out.println("连接网线上网");
    }
}
//接口转换器的抽象实现~
interface NetToUsb{
    //作川:处理请求,网线=>usb
    public void handleRequest();

}

//真正的适配器,需 要连接USB,连接网线~
//现在演示用对象适配器
class Adapter2  implements NetToUsb{

    //组合模式
    private Adaptee adaptee;

    public Adapter2(Adaptee adaptee){
        this.adaptee=adaptee;
    }
    @Override
    public void handleRequest() {
        //上网的具体实现,找一个转接头
        adaptee.request();
    }
}

//客户端关: 想上:网,插不L:网线~
public class Computer {
    //我们的电脑需要连接1:转按器才可以上网
    public void net(NetToUsb adapter){
        //.上网的具体实现, 找“个转接义
        adapter.handleRequest();
    }
    public static void main(String[] args) {
        //电脑,适配器,网线~
        Computer computer=new Computer();
        Adaptee adaptee=new Adaptee(); //网线
        Adapter2 adapter=new Adapter2(adaptee); //转换器,把网线转为usb
        computer.net(adapter);
    }
}

在这里插入图片描述
将目标类与适配者类解耦,可以通过引入一个适配器类来重用现有的适配者类,对客户端来说是透明的,且无需修改原来的代码,满足开闭原则。
对于类适配器来说,因为他需要继承适配者类,而Java不支持多重继承,因此一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类(如果使用抽象类,只能通过继承,但一个类只能有一个直接父类)。但对于对象适配器来说,使用关联关系关联适配者类,因此一次可以适配多个不同的适配者类到同一个目标。与类适配器相比,如果对象适配器想要置换适配者类的一个或多个方法比较麻烦,因为适配类和适配者类是关联关系。
注意:使用适配器模式的时候,客户端一定要针对抽象目标类进行编程,否则当修改适配者类或适配类的时候可能造成客户端不必要的代码改动。

参考:https://blog.csdn.net/lena7/article/details/116081627
https://blog.csdn.net/qq_40649503/article/details/110946521

相关文章