Java设计模式—适配器模式

在现实生活中也随处可见我们今天所说的适配器模式,例如,我们国家所用的电为220V的电压,而有的国家的电压是110V,假如我的笔记本电压需求是110V,那我的电脑岂不是在国外才能用吗?这就需要电源适配器了,电源适配器将无论是多少V的电压都转换成笔记本所需要的电压。这跟我们今天讲的适配器模式有些一样的道理,下面就说说适配器模式。

适配器模式顾名思义就是一种中间件,它存在于不匹配的两者之间,用于连接二者,将不匹配变得匹配,简单点理解就是笔记本电脑的电源适配器。举个例子,当我们要访问的接口A中没有我们想要的方法(我们在中国是220V电压,而我们笔记本电脑需要110V电压),却在另外一个接口B中发现了合适的方法(国外是110V的电压),但是我们又不能改变接口A的方法(你总不能把国家电压改为110V吧),此时我们就需要一个电源适配器来进行中转了。
看看适配器模式的结构:
①Target(目标抽象类):目标抽象类定义了客户所期待的接口,但是接口中的方法却不是我们所想要的,可以是一个抽象类或接口,也可以是具体类。(相当于上述情景的中国电压)
②Adapter(适配器类):它可以调用另外一个接口或类,作为一个转换器,对适配者类和目标抽象类进行适配。(电源适配器)
③Adaptee(适配者类):适配者类一般是一个具体的类,包含了客户希望使用的业务方法。(笔记本需要国外的110V电压)
结构图如下:
在这里插入图片描述
适配器模式分为四种:类适配器、对象适配器、接口适配器(缺省适配器)、双向适配器。
首先看第一种:类适配器
原理:通过继承来实现适配器功能。
首先一个目标抽象类,定义了客户所期待的接口,而这些接口是我们无法改变的

/**
 * @description:Chinese voltage is 220V
 */
public interface ChineseVoltage {
    public void voltageOfChinese();
}

定义了适配者接口

/**
 * @description:foreignVoltage is 110V
 */
public interface ForeignVoltage {
    public void theVoltageOfForeign();
}

定义一个类实现了适配者接口:

/**
 * @description:foreign类实现了ForeignVoltage接口,实现了适配者类
 */
public class Foreign implements ForeignVoltage{
    @Override
    public void theVoltageOfForeign() {
        System.out.println("110V电压");
    }
}

可以看出适配器类需要实现适配者类,并实现target接口,由于Java不允许多继承,所以在类适配器中,target必须定义为接口。

/**
 * @description:适配器类,继承了实现适配者类,并实现了target接口
 */
public class VoltageAdapter extends Foreign implements ChineseVoltage{
    @Override
    public void voltageOfChinese() {
        super.theVoltageOfForeign();
    }
}

客户端代码:

public class Client {
    public static void main(String args[]){
        ChineseVoltage cv = new VoltageAdapter();
        cv.voltageOfChinese();
    }
}/*output
  *110V电压
  */

第二种:对象适配器
对象适配器和类适配器其实是差不多的,只有类适配器是通过继承来实现的,而对象适配器是通过组合来实现的。即适配器类并没有继承自适配者类而是拥有一个适配者类的对象。

第三种:接口适配器,也称为(缺省适配器)
这种适配器主要用于:存在这样一个接口,其中定义了N多的方法,而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们要对所有的方法进行实现,哪怕我们仅仅是对不需要的方法进行置空,也会导致这个类变得臃肿,调用也不方便,这时我们可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有的方法都进行置空,那么我们在创建抽象类的继承类,而且重写我们需要使用的那几个方法即可。
原理:通过抽象类来实现适配。

第四种:双向适配器
如果在适配器中同时包含对目标类和适配器类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,那么这个适配器就是一个双向适配器。
结构图如下:
在这里插入图片描述
最后我们来看看适配器模式的应用场景:
①想要使用一个已经存在的类,但是它却不符合现有的接口规范(例如方法名),导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
②我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值