java结构型模式——适配器模式

结构型模式-适配器模式

什么是适配器?

在应用程序中,我们可能需要让两个不同接口的类来进行通信,在不修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。这个中间件就是适配器;

适配器的定义:

将一个类的接口转换成客户期望的另一个接口,适配器(Adapter)让原本接口不兼容的类可以相互合作

实际案例

​ 现在市面上的笔记本电脑越来越薄,很多电脑就去掉了传统的那种网线接口,是插不了网线的。要插网线就需要通过USB网线转化器来实现,这里就有一些适配器的思想体现了

USB网线转换器:一端连接电脑,另一端连接网线

image-20220508202012512

角色分析

目标接口: 客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。(这里的电脑接口)

需要适配的类: 需要适配的类或适配者类。(网线)

适配器: 通过包装一个需要适配的对象,把原接口转换成目标对象!(USB网线转换器)

代码实现适配器模式

创建三个类:网线,适配器,电脑

创建一个接口:USB接口(转换器)

1.创建网线抽象类

package com.gun.java23mvc.factory.adapter;
/**
 * 
 * 网线:要被适配的类(网线抽象类)
 * @author jkl
 *
 */
public class Reticle {
	// 上网连接功能
	public void request(){
		System.out.println("成功连接上了网线");
	}

}

2.创建USB接口

package com.gun.java23mvc.factory.adapter;
/**
 * USB接口
 * @author jkl
 *模拟接口转换器的接口,接口转换器的抽象实现~
 *通过实现这个接口,得到多个转换器
 */
public interface NetToUsb {
	
	 //作用:处理请求(将网线=>usb)
	public void handleRequest();
}

3.创建真正的适配器(通过继承的方式)

package com.gun.java23mvc.factory.adapter;
/**
 * 真正的适配器:需要连接USB接口,连接网线
 * @author jkl
 */
public class Adapter extends Reticle implements NetToUsb{

	//连接USB接口
	@Override
	public void handleRequest() {
		System.out.println("通过继承Reticle:成功连接USB转接口");
		super.request();//调用父类可以上网的接口(连接网线)
//		this.request();
		
	}
}

适配通过组合的方式实现

package com.gun.java23mvc.factory.adapter;
/**
 * @author jkl
 *对象适配器,通过组合来实现上网功能(开中常用)
 */
public class Adapter2 implements NetToUsb{

	private Reticle reticle;
	
	public void setReticle(Reticle reticle) {
		this.reticle = reticle;
	}
	@Override
	public void handleRequest() {
		System.out.println("通过组合:成功连接USB转接口");
		reticle.request();
	}

}

4.创建电脑类

package com.gun.java23mvc.factory.adapter;
/**
 * 电脑类:电脑需要连接SUB接口和网线才能上网
 * 客户端类:(电脑的抽象~)  想上网,但插不了网线
 * @author jkl
 *
 */
public class Computer {
	
	//连接USB接口
	public void net(NetToUsb adapter){
		adapter.handleRequest();
	}
}

5.创建客户类测试

package com.gun.java23mvc.factory.adapter;
/**
 * 客户端电脑真实上网
 * @author jkl
 *
 */
public class TestClient {
	
	public static void main(String[] args) {
		//需要电脑,网线,适配器~
		Computer computer = new Computer();
		Reticle reticle = new Reticle();
		//1.这种适配器是通过继承Reticle去实现的--》类适配器,
		Adapter adapter = new Adapter();
		
		// 2.通过组合去实现--》对象适配器(常用)
		Adapter2 adapter2 = new Adapter2();
		adapter2.setReticle(reticle);
		
		//1.调用上网的具体实现方法,给它一个转接器即可上网
        //该方法:适配器已经继承了Reticle(网线)了---》使得适配器自带上网功能
		computer.net(adapter);
		
		System.out.println("****************************************************");
		//2.组合实现,先插网线再接电脑
		computer.net(adapter2);
	
	}

}

输出结果:

通过继承Reticle:成功连接USB转接口
成功连接上了网线
****************************************************
通过组合:成功连接USB转接口
成功连接上了网线

案例画图总结

Computer(电脑)类 和 Reticle(网线)类没有任何关系,通过适配器将它们联系起来,从而实现了电脑上网

适配器的优点

  • 一个对象适配器可以把多个不同的适配者适配到同一个目标
  • 可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者
    的子类也可通过该适配器进行适配。

适配器的缺点

  • 对于ava、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者;
  • 在ava、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。

应用场景

  • 系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源
    代码。
  • 想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引
    持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者;
  • 在ava、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唂雨云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值