IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 适配器模式 -> 正文阅读

[移动开发]适配器模式

适配器模式属于结构型模式,它主要分为三类:类适配器模式,对象适配器模式, 接口适配器模式。

类适配器模式

场景:现在只有一个苹果充电接口,需要一个转接器让它变成安卓接口。

先创建一个已有的苹果类

public class Iphone {
    public void getInfo(){
        System.out.println("我是苹果接口");
    }
}

再来一个接口,接口提供可以让苹果转Android或者转Typec的两个方法

public interface IChangeType {

    public void changeAndroid();    //转成安卓接口
    public void changeTypeC();      //转成Type c接口
}

再创建一个适配器,这才是真正可以实现苹果转Android或者转Typec的功能。我们去超市买了转接器首先是不是将它插在苹果的接口上,那么可以理解成苹果里的东西都给了转接器,在这里Adapter 需要继承Iphone类,这样就有了Iphone的功能,然后经过特殊加工处理得到了适配Android或者Typec的
功能。加工处理的话是不是需要两个方法来生成出两种不同的接口,在这里Adapter还需要实现IChangeType接口。

public class ClassAdapter extends Iphone implements IChangeType{

    //转成安卓接口
    @Override
    public void changeAndroid() {
        getInfo();				//需要拿到苹果接口的东西,接着才好再它的基础上对它进行加工改造
        System.out.println("经过加工处理······");
        System.out.println("我现在是安卓接口");
    }

    //转成Type c接口
    @Override
    public void changeTypeC() {
        getInfo();				//需要拿到苹果接口的东西,接着才好再它的基础上对它进行加工改造
        System.out.println("经过加工处理······");
        System.out.println("我现在是typec接口");
    }
}

然后再创建客户端去用

public class Client {
    public static void main(String[] args) {

        //当我买了一个转接器
        ClassAdapter adapter = new ClassAdapter();
        //当需要一个Android接口
        adapter.changeAndroid();		//输出:			我是苹果接口
										//				经过加工处理······
										//				我现在是安卓接口
    }
}

类适配器模式需要继承被适配者,被适配的类方法会在适配器类中暴露出来(Adapter的方法里都需要调用getInfo()方法来拿到被适配的一些东西,如果多来几个适配器,那么使用成本就增加了。)

对象适配器

在上面的基础上稍做修改,不去继承Iphone类(使用组合替代继承),而是持有它的实例。

public class ObjectAdapter implements IChangeType {

    private Iphone iphone;

    public ObjectAdapter(Iphone iphone) {
        this.iphone = iphone;
    }

    //转成安卓接口
    @Override
    public void changeAndroid() {
        iphone.getInfo();
        System.out.println("经过加工处理······");
        System.out.println("我现在是安卓接口");
    }

    //转成Type c接口
    @Override
    public void changeTypeC() {
        iphone.getInfo();
        System.out.println("经过加工处理······");
        System.out.println("我现在是typec接口");
    }

}
public class Client {
    public static void main(String[] args) {
        ClassAdapter adapter = new ClassAdapter(new Iphone());
        adapter.changeAndroid();
    }
}

接口适配器模式

当不需要全部实现接口提供的方法时,可以先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(理解成空方法),那么该抽象类的子类可有选择性的覆盖父类的某些方法来实现需求。

再将上面对象适配器类进行改造,把类改为抽象类。

public abstract class AbstractAdapter implements IChangeType{
    private Iphone iphone;

    public AbstractAdapter(Iphone iphone) {
        this.iphone = iphone;
    }

    @Override
    public void changeAndroid() {
        iphone.getInfo();
    }

    @Override
    public void changeTypeC() {
		iphone.getInfo();
    }
}

实现两个方法的时候,方法体是没有任何的逻辑处理,(空方法的含义可以表示为没有进行过任何的逻辑处理),里面调用iphone.getInfo()目的是拿到原先Iphone接口它本身的东西,有了原材料才可以对它进行加工处理,只不过处理过程不在这里实现。

public class Client {
    public static void main(String[] args) {

        AbstractAdapter abstractAdapter = new AbstractAdapter(new Iphone()) {
            //只需要覆盖需要用的接口方法,
            //如果此时只需要Android接口,那么

            @Override
            public void changeAndroid() {
                //这里写具体实现
                super.changeAndroid();
                System.out.println("经过加工处理······");
                System.out.println("我现在是安卓接口");
            }
        };

        abstractAdapter.changeAndroid();
    }
}

像这样的话真正有用的功能是苹果转安卓,虽然可以通过abstractAdapter.changeTypeC();语句调用转Typec功能,但是我们并没有真正写了此功能的逻辑处理,所以即使用了也没有效果。

注意,需要在AbstractAdapter抽象类上重写所有的接口方法,如果不实现,那么会在客户端类Client被迫强制实现所有方法,也就与我们的初衷不一样。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 21:50:06  更:2021-11-14 21:50:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:45:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码