首页 > 其他分享 >设计模式——适配器模式

设计模式——适配器模式

时间:2023-09-26 20:31:45浏览次数:33  
标签:对象 适配器 接口 void 模式 设计模式 public

一、介绍

适配器模式主要是为了解决系统中两个接口实现某个或某类功能但又不兼容的问题,比如国内居民用电电压是220V,手机充电输入电压是5V,在给手机充电时需要将220V电压转换为5V,这个转换装置就可以理解为适配器,软件编程中有时也需要用到这种思想,解决这类问题就需要用到适配器模式。
适配器模式细分为类适配器模式、对象适配器模式接口适配器模式三种。

二、示例

1、类适配器模式

类适配器模式是指适配器类通过继承源对象类,实现目标接口的方式,在适配器类中实现目标接口定义的方法,在实现方法中调用源对象类方法并作相关转换,从而输出想要的结果。

1.1、UML类图

设计模式——适配器模式_目标对象

类适配器模式

在这个例子中,Voltage5VAdapter适配器类继承源对象类Voltage220V,实现目标对象接口IVoltage5V,实现IVoltage5V接口中定义的out方法,通过调用Voltage220V类中output方法获得源对象输出的电压,转换成需要的电压输出,手机类Phone调用charging方法开始充电,客户端类Client实现整个系统的运行。

1.2、代码
public class Voltage5VAdapter extends Voltage220V implements Voltage5V{

    @Override
    public int out() {
        return output()/44;
    }
}
public class Phone {

    public void charging(Voltage5VAdapter adapter){
        if (adapter.out() > 5){
            System.out.println("电压不对,无法充电");
        }else {
            System.out.println("充电中。。。");
        }
    }

}
1.3、小结

由于Java的单继承机制,在类适配器模式中,由于继承了源对象,所以目标对象只能是接口形式,这有一定的局限。同时继承也会使得父类中一些方法暴露给了子类,增加了耦合度。

2、对象适配器模式

为解决类适配模式中目标对象只能是接口的限制,对象适配器模式中,适配器类不再继承源对象,源对象以全局变量形式聚合到适配器类中,这样目标对象可以是接口也可以是抽象类,同时继承的减少,耦合度也降低。

2.1、UML类图

设计模式——适配器模式_适配器模式_02

对象适配器模式

在这种模式下,源对象Voltage220V以全局变量的形式聚合到适配器类Voltage5VAdapter中,在构造方法中传入源对象实例,目标对象方法实现中通过源对象实例去调用相关方法做转换,最后输出结果。

2.2、代码
public class Voltage5VAdapter extends Voltage5V{

    private final Voltage220V voltage220V;

    public Voltage5VAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int out() {
        return voltage220V.output()/44;
    }
}
public class Phone2 {

    public void charging(Voltage5VAdapter adapter){
        if (adapter.out() > 5){
            System.out.println("电压不对不能充电");
        }else {
            System.out.println("充电中...");
        }
    }
}
2.3、小结

源对象以全局变量的形式聚合到适配器类中,目标对象可以是接口形式,也可以是抽象类形式,系统更加灵活。

3、接口适配器模式

接口适配器模式主要是为了解决实现类不需要实现接口中定义的全部方法这一问题,比如一个接口中定义了很多个方法,但实现者只用到其中一个,如果直接实现接口,那么全部方法都会以空实现的形式存在类中,实现类会显得臃肿,如果是匿名内部类去实现,那代码可读性更差,为解决这一问题,我们可以用一个抽象类去实现接口,外部调用传入抽象类,这样就可以需要哪个方法就只用实现哪个方法即可。

public interface IInterface {
    void f1();
    void f2();
    void f3();
}
public abstract class AbsInterfaceAdapter implements IInterface{

    @Override
    public void f1() {

    }

    @Override
    public void f2() {

    }

    @Override
    public void f3() {

    }
}
public class Main {

    public static void main(String[] args){
        AbsInterfaceAdapter adapter = new AbsInterfaceAdapter() {
            @Override
            public void f1() {
                super.f1();
                System.out.println("外部只实现f1方法");
            }
        };
        adapter.f1();
    }
}

三、总结

Android中适配器,最常见和常用那莫过于RecyclerView的Adapter了,在这套系统中,Adapter适配器主要是作为data和view的桥梁,解决数据显示在控件上的适配兼容问题,data作为源对象,以全局变量的形式聚合在adapter类中,同时adapter类实现了ViewHolder这个目标接口,通常我们需要自建一个类去实现ViewHolder接口,实现getItem(),在这个方法中通过findViewById找到各个控件返回,然后通过ViewHolder对象取到哥哥控件对象进行data赋值,这样数据就显示到了控件上,这里用到了对象适配器模式,由于类适配器模式的限制,平时开发中最常用的还是对象适配器模式
学习了设计模式再结合到项目中,不得不感叹设计模式之类。

标签:对象,适配器,接口,void,模式,设计模式,public
From: https://blog.51cto.com/u_16175630/7614339

相关文章

  • Redis 主从复制、哨兵模式、群集模式
    Redis主从复制、哨兵模式、群集模式目录1.Redis的2种持久化方式2.Redis优化3.Redis主从复制的原理3.1配置文件3.2Redis主从复制4.Redis哨兵模式4.1哨兵机制4.2哨兵模式的作用4.3哨兵结构4.4哨兵模式配置1.Redis的2种持久化方式RDB持久化定时把red......
  • 向着趋势奔跑:银行客户中心转型,重构商业模式是关键
    随着金融市场化改革的推进国内银行同业间的竞争日趋激烈各商业银行在全新的监管要求和市场环境下纷纷开始推行“以客户为中心”的经营新模式迅速提升核心竞争力然而!!!奇怪的事情发生了......
  • 向着趋势奔跑:银行客户中心转型,重构商业模式是关键
    随着金融市场化改革的推进国内银行同业间的竞争日趋激烈各商业银行在全新的监管要求和市场环境下纷纷开始推行“以客户为中心”的经营新模式迅速提升核心竞争力  然而!!!奇怪的事情发生了......
  • c#中适配器模式详解
    基础介绍:  想象这样一个场景,原项目中接口返回的数据是XML格式的数据,但现在来了一个新客户,它期望接口返回的数据类型为json格式的。  想要实现要么就是改原有接口,但这样就违反了开闭原则,容易出现未知bug,影响到老客户的正常使用。  而如果写一个适配器类也就是转换类(第三方......
  • 自动化模式下,企业全面预算管理的提升
    近年来,经济世界不确定事件的频频发生,让企业开始关注自身的关键财务弱点。企业在财务能力敏捷性提升的方面仍存在一定的差距,而在数字化转型过程中进行的投资不够,将难以推动企业冲出重围,提高前瞻性和自身预测能力。这预示着数字化转型的紧迫性,而部分企业在转型和改革过程中,在不确定的......
  • MySQL正则表达式:模式匹配、中文匹配、替换、提取字符串
    在MySQL中,使用REGEXP或RLIKE操作符进行正则表达式匹配,而使用NOTREGEXP或NOTRLIKE操作符进行不匹配。一些常用的MySQL正则表达式语法:匹配字符:.:匹配任意字符(除了换行符)。[]:匹配方括号中的任意字符。[^]:匹配不在方括号中的任意字符。匹配重复:*:匹配零个或多个前面的字符。+:匹配一个......
  • golang 多生产者+多消费者模式
    参考https://gist.github.com/vitan/aedb628a40478cf8b6a33dc87a5ff52fhttps://gist.github.com/mochow13/74ee57078d58536929575ab481dd96931packagemainimport( "errors" "fmt" "math" "reflect" "sync")......
  • 2023-09-25 裸k交易法 日内模式 本级别禁忌
    比如我就是做1分钟的波段,但是什么情况是不能做的?1.本级别N字形(上上级别横盘)。(1)可以放宽止损(2)做更小波段2.一会阳盖阴,一会阴并阳。高一级别5分钟也在震荡,这种行情过滤不做3.一会阳盖阴,一会阴并阳。高一级别5分钟形成小趋势,可以更换级别,做3分钟或者5分钟级别。 1.本级别N......
  • poython文件运行模式和python控制台运行模式和Juputer运行模式
    今天学pytorch,我知道了python文件是整个代码运行,,而python控制台是一行一行的运行。而Juputer是任意代码块运行的。 ......
  • uniapp项目实践总结(二十二)分包优化和游客模式
    导语:这篇主要介绍应用分包和游客模式相关的内容。目录应用分包游客模式应用分包微信对于小程序的打包压缩后的代码体积是有限制的,网页和APP也可以适用分包功能,因此需要进行分包添加以及分包优化。分包添加在pages.json文件中添加分包的信息。例如:有一个名叫user的分......