【设计模式】结构型模式之类适配器模式

概述

定义

定义:将一个类的接口转换成用户期望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少。本篇先讲类适配器模式。

结构

适配器模式包含以下主要角色:

  • 目标(Target)接口:当前系统业务所期待的接口,可以是抽象类或者接口
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

UML图

接下来我们用一个现实生活中的例子来讲解适配器模式,例:现有一台电脑只能读取SD卡,而要读取TF卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将TF卡中的内容读取出来。

类图如下:

Computer
+readSD(SDCard sdCard) : String
«interface»
SDCard
+readSD() : String
+writeSD() : void
SDCardImpl
+readSD() : String
+writeSD() : void
SDAdapterTF
+readSD() : String
+writeSD() : void
«interface»
TFCard
+readTF() : String
+writeTF() : void
TFCardImpl
+readTF() : String
+writeTF() : void
Client
+main() : void

图中,SDCard和SDCardImpl即为目标(Target)接口及其实现类;TFCard和TFCardImpl即为适配者(Adaptee)接口及其实现类;SDAdapterTF即为适配器(Adapter)类。

代码实现(Java)

  • SDCard接口代码
package adapter;

public interface SDCard {
	//从SD卡中读取数据
	String readSD();
	//从SD卡中写数据
	void writeSD(String msg);
}

  • SDCardImpl类代码
package adapter;

public class SDCardImpl implements SDCard {

	@Override
	public String readSD() {
		String msg = "readSD() -> hello";
		return msg;
	}

	@Override
	public void writeSD(String msg) {
		System.out.println("writeSD() : " + msg);
	}

}

  • TFCard接口代码
package adapter;

public interface TFCard {
	//从TF卡中读取数据
	String readTF();
	void writeTF(String msg);
}

  • TFCardImpl类代码
package adapter;

public class TFCardImpl implements TFCard {

	@Override
	public String readTF() {
		String msg = "readTF() -> hello";
		return msg;
	}

	@Override
	public void writeTF(String msg) {
		System.out.println("writeTF() : " + msg);
	}

}

  • SDAdapterTF类代码
package adapter;

public class SDAdapterTF extends TFCardImpl implements SDCard{

	@Override
	public String readSD() {
		System.out.println("adapter read tf card");
		return readTF();
	}

	@Override
	public void writeSD(String msg) {
		System.out.println("adapter write tf card");
		writeTF(msg);
	}

}

  • Computer类代码
package adapter;

public class Computer {
	//从SD卡中读取数据
	public String readSD(SDCard sdCard) {
		if(sdCard == null) {
			throw new NullPointerException("sd card is not null");
		}
		return sdCard.readSD();
	}
}

  • Client类代码
package adapter;

public class Client {
	public static void main(String[] args) {
		//创建计算机对象
		Computer computer = new Computer();
		String msg = computer.readSD(new SDAdapterTF());
		System.out.println(msg);
	}
}
/*
控制台输出为:
adapter read tf card
readTF() -> hello
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值