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 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 设计模式(二)适配器模式 -> 正文阅读

[Java知识库]设计模式(二)适配器模式

定义

适配器模式用于解决接口间的兼容问题。

当我们需要使用某个类提供的接口,但是这个接口与现在的系统需求不符,由于该接口是由第三方提供的,或者是已经在生产上跑了很久的存量类,我们不想通过改变这个类来满足现在系统的需求,那么这时候就可以考虑通过将目标类封装成一个满足系统需求的新类,因此适配器(Adapter)也称为包装器(Wrapper)。

结构

适配器模式包含如下角色:

  • Target:目标抽象类,客户类期望的接口。
  • Adapter:适配器类,适配器模式的核心,实现目标抽象类和适配者类的转换。
  • Adaptee:适配者类,与目前需求不兼容的类,即需要被包装的类。
  • Client:客户类,调用在目标抽象类中定义的业务方法。

适配器模式有类适配器和对象适配器两种实现:
1、在类适配器模式中,适配器类实现了目标抽象类接口并继承了适配者类,在目标抽象类的实现方法中调用所继承的适配者类的方法。
在这里插入图片描述

2、在对象适配器模式中,适配器类实现了目标抽象类并定义了一个适配者类的对象实例,在目标抽象类的实现方法中调用适配者类实例的方法。
在这里插入图片描述

示例

假如我们手上有一只手机,它只有一个type-c接口,同时手上有一条3.5mm的耳机,想听音乐的时候就会发现二者不兼容,相较于更换手机或者耳机,一般我们会选择一条type-c和3.5mm的转接线来实现最高性价比。
此时将3.5mm耳机比作客户端(客户类),它期望得到音乐信号的目标是3.5mm接口(目标抽象类),type-c接口则是手机提供的音乐信号传输接口(适配者类),与耳机接头不兼容,而转接线(适配器类)可以将type-c接口包装为耳机可以插入的3.5mm接口,能够解决手机与耳机的不兼容问题,实现用耳机接收手机播放的音乐信号。

1、定义目标抽象类,即客户类期望的接口。

public interface ThreePointFiveConn {
	//一个提供音乐的3.5mm接口
	public void playMusic(String connector);
}

2、定义适配者类,即需要被包装的类。

public interface PlayMusicConn {
	public void playMusicOut(String connector);
}

public class TypecPlayMusicConn implements PlayMusicConn {
	//只允许typec接头插入
	public void playMusicOut(String phoneConnType, String musicName) {
		if("typec".equals(phoneConnType)){
			//实现播放音乐功能
			System.out.println("playing music with typec Player..." + musicName);
		}else {
			System.out.println("error!");
		}
	}
}

public class LightningPlayMusicConn implements PlayMusicConn {
	//只允许Lightning接头插入
	public void playMusicOut(String phoneConnType, String musicName) {
		if("lightning".equals(phoneConnType)){
			//实现播放音乐功能
			System.out.println("playing music with lightning Player..." + musicName);
		}else {
			System.out.println("error!");
		}
	}
}
  • 类适配器模式:由于适配器类是适配者类的子类,因此可以在适配器类中重写适配者类的方法,使得适配器类更具灵活性。

3、构建适配器类,将适配者类PlayMusicConn包装为目标抽象类ThreePointFiveConn的一个子类。

public class Transverter extends TypecPlayMusicConn implements ThreePointFiveConn {
	//调研继承的适配者类的方法
	public void playMusic(String musicName) {
		super.playMusicOut("typec", musicName);
	}
}

4、客户端类(耳机)使用

public class EarPhone {
	public static void main(String[] args) {
		ThreePointFiveConn earPhone = new Transverter();
		earPhone.playMusic("Hey Jude");
	}
}

运行结果:

playing music with typec Player…Hey Jude

  • 对象适配器模式:一个对象适配器类可以把多个不同的适配者类及其子类适配到同一个目标抽象类,因此具有更大的兼容性。

3、构建适配器类,将适配者类PlayMusicConn包装为目标抽象类ThreePointFiveConn的一个子类。

public class Transverter implements ThreePointFiveConn {
	//定义适配者类的对象实例
	private PlayMusicConn playMusicConn;
	
	public Transverter(PlayMusicConn playMusicConn){
		this.playMusicConn = playMusicConn;
	}

	public void playMusic(String musicName) {
		if(playMusicConn instanceof TypecPlayMusicConn) {
			playMusicConn.playMusicOut("typec", musicName);
		}else if(playMusicConn instanceof LightningPlayMusicConn) {
			playMusicConn.playMusicOut("lightning", musicName);
		}else {
			System.out.print("error!");
		}
	}
}

4、客户端类(耳机)使用

public class EarPhone {
	public static void main(String[] args) {
		//typec接口手机播放音乐
		ThreePointFiveConn earPhone = new Transverter(new TypecPlayMusicConn());
		earPhone.playMusic("Hey Jude");
		//lightning接口手机播放音乐
		ThreePointFiveConn earPhone1 = new Transverter(new LightningPlayMusicConn());
		earPhone1.playMusic("Hey Jude");
	}
}

运行结果:

playing music with typec Player…Hey Jude
playing music with lightning Player…Hey Jude

扩展

除类适配器和对象适配器模式外,还有一种接口适配器模式。接口适配器模式是指在定义适配器时,先将其定义为一个抽象类实现接口,接口中定义了多个抽象方法,定义该适配器的子类时,子类只实现其中的部分抽象方法。
它适用于一个接口不想使用其所有的方法的情况。因此也称为单接口适配器模式。

public abstract class TransverterInterface implements ThreePointFiveConn {
	PlayMusicConn playMusicConn = new TypecPlayMusicConn();
	
	public void playMusic(String musicName) {
		playMusicConn.playMusicOut("typec", musicName);
	}
	
	public void anotherMethod1(){}
	public void anotherMethod2(){}
}

public class TransverterInterfaceImpl extends TransverterInterface {
	public void playMusic(String musicName) {
		super.playMusic(musicName);
	}
}

总结

适配器模式的主要优点是将目标类和适配者类解耦,增加了类的透明性和复用性,同时系统的灵活性和扩展性都非常好,更换适配器或者增加新的适配器都非常方便,符合“开闭原则”。
适配器模式适用情况包括:系统需要使用现有的类,而这些类的接口不符合系统的需要;想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类一起工作。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:02:26  更:2021-09-06 11:03:59 
 
开发: 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/23 12:58:28-

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