美文网首页Android
Java 适配器模式

Java 适配器模式

作者: CodeDuan | 来源:发表于2022-01-29 17:10 被阅读0次

    一、简介

    定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

    适配器模式分为类结构型模式对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

    主要角色:

    1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
    2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
    3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

    二、 类结构型模式

    通过适配器以及上面的定义我们可以知道,适配器模式就是为了适配或兼容当前已有的类,因为我们原本的接口不兼容所导致类之间无法一起工作,适配器就是为了解决这一点,为了更好理解,我们先看未使用适配器模式之前的代码。

    举例:当前有一台电脑,可以读取和写入SD卡,先看代码实现。

    目标接口:

    public interface SdCard {
        //读取Sd卡的数据
        String readSdCard();
        //写入Sd卡的数据
        void writeSdData(String data);
    }
    

    实现类:

    public class SdCardImpl implements SdCard{
        @Override
        public String readSdCard() {
            return "我是Sd卡中的数据";
        }
    
        @Override
        public void writeSdData(String data) {
            System.out.println("往Sd卡中写入了数据:"+data);
        }
    }
    

    电脑类:

    public class Computer {
        private SdCard sdCard;
        
        public Computer(SdCard sdCard){
            this.sdCard = sdCard;
        }
        //读取数据
        public String readData(){
            return sdCard.readSdCard();
        }
        //写入数据
        public void writrData(String data){
            sdCard.writeSdData(data);
        }
    }
    

    使用:

     Computer computer = new Computer(new SdCardImpl());
            //读取数据
            String data = computer.readData();
            System.out.println(data);
            //写入数据
            computer.writrData("我是数据");
    

    输出:

    我是Sd卡中的数据
    往Sd卡中写入了数据:我是数据
    

    此时使用电脑读取和写入Sd卡中的数据就完成了。那么此时需求来了,我又想用电脑读取Tf卡中的数据,又不能修改现有的代码怎么办?接下来就要用适配器模式,来看代码:

    适配者类(Tf):

    public interface TfCard {
        //读取Tf卡的数据
        String readTfCard();
        //写入Tf卡的数据
        void writeTfData(String data);
    }
    
    public class TfCardImpl implements TfCard{
        @Override
        public String readTfCard() {
            return "我是Tf卡中的数据";
        }
    
        @Override
        public void writeTfData(String data) {
            System.out.println("往Tf卡中写入了数据:"+data);
        }
    }
    

    适配器类

    //实现SdCard
    //继承TfCard实现类
    public class SdAdapterTf extends TfCardImpl implements SdCard{
        @Override
        public String readSdCard() {
            return readTfCard();
        }
    
        @Override
        public void writeSdData(String data) {
            writeTfData(data);
        }
    }
    

    使用:

        public static void main(String[] args) {
            Computer computer1 = new Computer(new SdAdapterTf());
            //读取数据
            String data1 = computer1.readData();
            System.out.println(data1);
            //写入数据
            computer1.writrData("我是数据");
        }
    

    输出:

    我是Tf卡中的数据
    往Tf卡中写入了数据:我是数据
    

    至此类结构型适配器已经完成了,简单理解就是说 我们为现有类提供了一个适配器类(SdAdapterTf),通过实现目标类的接口,实现里面的读写方法,并继承适配者类和调用适配者的读写方法完成了适配,是通过new Computer传入适配器,Computer构造方法接收SdCard的参数,因为适配器实现了SdCard,并调用适配者的方法,因为适配器也继承自TfCard,从而达到适配的效果。

    由此补充一点:只有当业务中存在一个接口规范的情况下才可以用。

    三、对象结构型模式

    对象结构型相比上面的类结构型只有适配器类(SdAdapterTf)发生了改变,类结构型采用继承的模式实现,而对象结构型采用聚合的模式实现。

    适配器类

    //实现SdCard
    //持有TfCard
    public class SdAdapterTf  implements SdCard {
        private TfCard tfCard;
    
        public SdAdapterTf(TfCard tfCard){
            this.tfCard = tfCard;
        }
        @Override
        public String readSdCard() {
            return tfCard.readTfCard();
        }
    
        @Override
        public void writeSdData(String data) {
            tfCard.writeTfData(data);
        }
    }
    

    使用:

    public static void main(String[] args) {
            TfCardImpl tfCard = new TfCardImpl();
            SdAdapterTf sdAdapterTf = new SdAdapterTf(tfCard);
            Computer computer = new Computer(sdAdapterTf);
            //读取数据
            String data = computer.readData();
            System.out.println(data);
            //写入数据
            computer.writrData("我是数据");
        }
    

    输出:

    我是Tf卡中的数据
    往Tf卡中写入了数据:我是数据
    

    关于适配器模式的应用场景:

    之前开发的系统与现在新功能的接口不一致;

    第三方sdk中的接口和自己要求的接口定义不同时。

    相关文章

      网友评论

        本文标题:Java 适配器模式

        本文链接:https://www.haomeiwen.com/subject/mkkfkrtx.html