适配器模式

适配器模式

一、概述

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

那些类可以在一起工作

当两种不同设备要进行沟通时,需要一个**中间量(转换器)**的来实现他们的连接,例如:USB网线转换器等。

代码

以USB网线转换器为例

这里采用继承方式(类适配器,单继承,存在弊端)

1.事先规定一个接口用于处理请求

//先造一个转换接口

//接口转换器的抽象实现
public interface NetToUsb {

    //处理转换请求的方法;
    public void handleRequest();
}

2.找到要被适配的对象(这里指的是网线)

//要被适配的网线
public class Net {
    //该设备的请求
    public void request() {
        System.out.println("连接网线,上网");
    }
}

3.写出真正的适配器的适配方法

//真正的适配器
//既要连接网线还要连接USB
//因此这个类需要实现NetToUsb接口
//又因为它要处理上网的请求,因此采用继承Net类
public class Adapter extends Net implements NetToUsb {

    //根据网线类的请求来处理转换请求
    @Override
    public void handleRequest() {
        //直接调用父类(网线)的上网请求方法
        super.request();
    }
}

4.生成一个需要适配器的客户端类

//电脑要上网
public class Computer {

   //实现上网功能,需要转换器(参数)
    public void net(NetToUsb netToUsb) {
        //需要一个转接头,因此传递一个NetToUsb接口
        //通过转接器间接处理请求;
       netToUsb.handleRequest();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        //需要一根网线;
        Net net = new Net();
        //需要一台电脑;
        Computer computer = new Computer();
        //需要一个适配器;
        Adapter adapter = new Adapter();
        
        //这里可以形象是看成:电脑(computer)要上网(net)需要适配器(adapter)。
        computer.net(adapter);
    }
}

这里采用组合方式(对象适配器,推荐)

public interface TransitionInterface {
    //转换请求
    void transitionRequest();
}
//需要被适配的设备(如:网线)
public class Equipment2 {

    //有自己的功能请求
    public void myRequest() {
        System.out.println("我的功能请求是---------");
    }
}

这里没有采用继承方式,而是通过传递对象类(需要被适配的类)。

//真正的适配器
public class Adapter implements TransitionInterface {

    private Equipment2 equipment2;

    public Adapter(Equipment2 equipment2) {
        this.equipment2 = equipment2;
    }

    //通过该方法,进行请求转换
    @Override
    public void transitionRequest() {
        equipment2.myRequest();
    }
}

设置客户端

//设备(如:电脑)
public class Equipment1 {

    //需要一个转换器接口,实现该设备想要完成的功能
    public void function(TransitionInterface transition) {
       //通过转换器处理转换请求
        transition.transitionRequest();
    }
}
public class Test {
    public static void main(String[] args) {
        Equipment1 equipment1 = new Equipment1();
        Equipment2 equipment2 = new Equipment2();
        Adapter adapter = new Adapter(equipment2);//对象类适配器

        equipment1.function(adapter);
    }
}

二、角色分析

1.目标接口

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

2.被适配的类

需要适配的类或适配者类

3.适配器

通过包装一个需要适配的对象,把原接口转换成目标对象!

三、总结

1.对象适配器优点

A.一个对象适配器可以把多个不同的适配者适配到同一个目标(客户端)。

B.可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者

的子类也可通过该适配器进行适配。

2.类适配器缺点

A.对于Java、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适

配者。

B.在Java、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。

3.适用场景

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

代码。

B.想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值