适配器模式

适配器模式

一.定义:

​ 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

​ 在生活中也有很多适配的例子,比如说手机充电,我国采用的220v电压,但是手机却只能支持5v左右的电压,那肯定服务直接用220v的电压嘛,所以电源适配器(充电器头)应运而生,它将220v的电压转换成了5v的,咱就可以愉快的使用了。

二.优点:
  1. 可以让任何两个没有关联的类一起运行。

  2. 提高了类的复用。

  3. 增加了类的透明度。

  4. 灵活性好。

  5. 系统需要使用现有的类,但现有的类却不兼容。

  6. 需要建立一个可以重复使用的类,用于一些彼此关系不大的类,并易于扩展,以便于面对将来会出现的类。

  7. 需要一个统一的输出接口,但是输入类型却不可预知。

三.缺点:
  1. 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  2. 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
四.实列

​ 结构:

在这里插入图片描述

​ 公共类:

​ 被适配的类

package 适配器模式.类适配模式;

/**
 * 被适配的类
 * @author mx
 */
public class Adaptee {
    public void specificRequest()
    {
        System.out.println("适配者中的业务代码被调用!");
    }
}

适配的接口

package 适配器模式.类适配模式;

public interface Target {
    public void request();
}

​ 1.类适配模式

在这里插入图片描述

​ 适配器类

package 适配器模式.类适配模式;

/**
 * 类适配器类
 * @author mx
 */
public class ClassAdapter extends Adaptee implements Target {
    public void request()
    {
        specificRequest();
    }
}

测试

package 适配器模式.类适配模式;

public class ClassAdapterTest {
    public static void main(String[] args)
    {
        System.out.println("类适配器模式测试:");
        Target target = new ClassAdapter();
        target.request();
    }
}

结果:
在这里插入图片描述

解释: 在此案列中,我们无法通过Target的request方法直接调用Adaptee的specificRequest,所以我们采用了一个适配类,这个类是Adaptee的子类,又实现了Target的request方法,在request去调用父类的specificRequest方法,这就解决了不兼容的问题啦。但是类适配模式有较强的耦合性,不利于实际生产开发。

2.对象适配模式

在这里插入图片描述

对象适配类

package 适配器模式.对象适配模式;

import 适配器模式.类适配模式.Adaptee;
import 适配器模式.类适配模式.Target;

/**
 * 对象适配器类
 *
 */
public class ObjectAdapter  implements Target {
    private Adaptee adaptee;
    public ObjectAdapter(Adaptee adaptee)
    {
        this.adaptee=adaptee;
    }
    public void request()
    {
        adaptee.specificRequest();
    }
}

测试

package 适配器模式.对象适配模式;

import 适配器模式.类适配模式.Adaptee;
import 适配器模式.类适配模式.Target;

/**
 * @author mx
 */
public class ObjectAdapterTest
{
    public static void main(String[] args)
    {
        System.out.println("对象适配器模式测试:");
        Adaptee adaptee = new Adaptee();
        Target target = new ObjectAdapter(adaptee);
        target.request();
    }
}

结果:
在这里插入图片描述

解释:在对象适配器模式中,并没有及去继承被适配类Adaptee,而是在对象适配类中创建了一个被适配类的对象(相当于套了一层壳),我们在实现request方法时就去调用Adaptee的specificRequest就可以了,如此既实现了适配,就降低了耦合性。

五. 适配器模式与代理模式的区别

https://blog.csdn.net/weixin_49639753/article/details/120474087

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值