您现在的位置是:首页 >技术交流 >肝一肝设计模式【五】-- 适配器模式网站首页技术交流

肝一肝设计模式【五】-- 适配器模式

老六说编程 2023-07-13 04:00:02
简介肝一肝设计模式【五】-- 适配器模式

系列文章目录

肝一肝设计模式【一】-- 单例模式 传送门
肝一肝设计模式【二】-- 工厂模式 传送门
肝一肝设计模式【三】-- 原型模式 传送门
肝一肝设计模式【四】-- 建造者模式 传送门



前言

我们知道设计模式可以分为三大类:创建型模式、结构型模式、行为型模式。前文中我们把五种创建型模式分析完了,从本节开始我们来分析一下结构型模式,结构型模式有七种,首先我们先了解一下适配器模式。


一、什么是适配器模式

适配器模式(Adapter Pattern),将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

适配器模式中有三种角色:

  • 目标(Target):客户端所希望的接口
  • 源(Adaptee):被适配的接口
  • 适配器(Adapter):将Target请求适配到Adaptee的相应接口中处理

适配器模式主要有两种,分别是类适配器和对象适配器。

如果用日常生活来举例的话,比如我们出国旅行,电源适配的问题往往是旅行必须要解决的,国内的电压是220V,如果目的地是欧洲的话,欧洲有些国家的电压就是110V或者120V,且插头形状还不一样,这时候我们往往就需要带一个转换器,这个转换器做的事情其实就是适配器模式所做的事情

二、类适配器

类适配器模式,主要通过继承来实现适配器功能。

写下代码:

需要适配的欧洲插座

public interface EuropeSocket {
	public void power110();
}

自己的国内插头

public class ChineseSocket {
    public void power220(){
    	System.out.println("220V供电");
    }
}

适配器转换

public class SocketAdapter extends ChineseSocket implements EuropeSocket {
	@Override
	public void power110() {
		System.out.println("适配器接入欧洲插座");
		power220();
	}
}

测试代码

public class AdpaterTest {
    public static void main(String[] args) {
        SocketAdapter adapter = new SocketAdapter();
        System.out.println("国内插头插入适配器。");
        adapter.power110();
    }
}

三、对象适配器

对象适配器模式,通过组合来实现适配器功能。

写下代码:

修改下适配器代码

public class SocketAdapter implements EuropeSocket {

	private ChineseSocket chineseSocket;

	public SocketAdapter(ChineseSocket chineseSocket) {
		this.chineseSocket = chineseSocket;
	}
	
	@Override
	public void power110() {
		System.out.println("适配器接入欧洲插座");
		chineseSocket.power220();
	}
}

测试代码

public class AdpaterTest {
    public static void main(String[] args) {
        SocketAdapter adapter = new SocketAdapter(new ChineseSocket());
        System.out.println("国内插头插入适配器。");
        adapter.power110();
    }
}

四、在JDK中的应用

在JDK中,适配器模式有多种应用场景,下面列举两个常见的例子:

  • Java集合框架中的适配器模式:Java提供了一系列集合类(如ArrayList、LinkedList、HashMap等),它们实现了各自的接口(如List、Map等)。有时候我们需要将一个集合对象转换成另一个接口类型的集合对象,这时就可以使用适配器模式。例如,通过Collections类的静态方法checkedList()可以将一个List对象转换成指定类型的List对象。
  • InputStreamReader和OutputStreamWriter类:这两个类是Java IO库中用于字符流和字节流之间的适配器。InputStreamReader将字节流转换成字符流,OutputStreamWriter将字符流转换成字节流。它们通过适配器模式使得原本不兼容的字符流和字节流能够协同工作。

写在最后

类适配器和对象适配器,这两种适配器更推荐使用对象适配器模式,相比类适配器模式,它更加灵活,也符合设计原则中的合成复用原则。

适配器模式的使用场景:

  • 当系统比较陈旧的时候,随着业务的发展,新增了需求,然而短时间没有办法更新系统,所以采取添加中间层的办法采用适配器模式来兼容。

适配器模式的优点:

  • 有更好的复用性和灵活度。

适配器模式的缺点:

  • 过多使用适配器会使得系统变得比较杂乱,明明调用的是A接口,内部却被适配成了B接口。因此除非必要,不推荐使用适配器,而是直接对系统重构
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。