设计模式(11):适配器模式

一.什么使适配器模式?

  • 将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

二.模式中的角色

  • 目标角色(Target): 客气所期待的接口。目标可以是具体的或抽象的类,也可以是接口;
  • 需要适配的类(Adaptee): 需要被适配的类或适配者类;
  • 适配器(Adapter): 通过包装一个需要适配的对象,把原接口转换成目标接口。

三.工作中的场景

  • 经常用来做旧系统改造和升级;
  • 如果我们的系统开发之后再也不需要维护,那么很多模式都是没有必要的,但是不幸的是,事实却是维护一个系统的代价往往是开发一个系统的数倍。

四.开发中的场景

  • SpringMVC中的HandlerAdapter使用了适配器模式。处理器的类型不同,处理请求的方式也不同。
  • JDBC驱动程序。不同的数据库提供商实现了不同的JDBC驱动接口,使用适配器模式可以将这些不同的接口适配为标准的JDBC接口,提高应用程序的可移植性。

五.举例代码实现

  • 1.举例: 假如我们的鼠标不是USB接口,是传统的ps/2接口,没有办法连接我们的电脑,这个时候我们需要一个转换头,把传统的ps/2转换成USB。这里我们的转换头就是适配器对象,鼠标就是被适配器对象。

  • 2.代码实现

    (1)被适配对象(Adaptee)

java 复制代码
/**
 * 被适配器(相当于键盘)
 */
public class Adaptee {
	public void request(){
		System.out.println("可以完成客户请求的需要的功能!");
	}
}

    (2)目标角色(Target)

java 复制代码
/**
 * 相当于USB 接口
 */
public interface Target {
	void handleReq();
}

    (3)适配器(Adapter)

java 复制代码
/**
 * 适配器(相当于USB和ps/2转换器)
 */
public class Adapter extends Adaptee implements Target{
	@Override
	public void handleReq() {
		super.request();
	}	
}

    (4)调用

java 复制代码
/**
 * 相当于电脑(只有USB接口)
 */
public class App {
	public void test(Target t) {
		t.handleReq();
	}
	public static void main(String[] args) {
		App c = new App();
		c.test(new Adapter());
	}	
}

    (5)使用组合的方式跟被适配对象整合

java 复制代码
/**
 * 类适配器(相当于转换器)
 * (对象适配器,使用了组合的方式跟被适配对象整合)
 */
public class Adapter implements Target{
	private Adaptee apadtee;
	public Adapter(Adaptee apadtee) {
		this.apadtee = apadtee;
	}
	@Override
	public void handleReq() {
		apadtee.request();
	}
}

    (6)调用

java 复制代码
public class App {
	public void test(Target t) {
		t.handleReq();
	}
	public static void main(String[] args) {
		App c = new App();
		Target t=new Adapter(new Adaptee());
		c.test(t);
	}	
}

更多设计模式学习:

设计模式(1):介绍

设计模式(2):单例模式

设计模式(3):工厂模式

设计模式(4):建造者模式

设计模式(5):原型模式

设计模式(6):桥接模式

设计模式(7):装饰器模式

设计模式(8):组合模式

设计模式(9):外观模式

设计模式(10):享元模式

设计模式持续更新中...

相关推荐
27669582921 分钟前
得物 小程序 6宫格 分析
java·python·小程序·得物·得物小程序·得物六宫格·六宫格验证码
知了一笑2 分钟前
通过IP计算分析归属地
java·ip·ip定位·ip计算
沃野_juededa17 分钟前
uniapp自定义选项卡
java·前端·javascript
问道飞鱼1 小时前
【springboot知识】配置方式实现SpringCloudGateway相关功能
java·spring boot·后端·gateway
樽酒ﻬق1 小时前
打造美观 API 文档:Spring Boot + Swagger 实战指南
java·spring boot·后端
碎梦归途2 小时前
23种设计模式-行为型模式之中介者模式(Java版本)
java·jvm·设计模式·中介者模式·软件设计师
Java手札2 小时前
在idea开发中遇到的20个bug
java·bug·intellij-idea
南客先生2 小时前
Arthas在Java程序监控和分析中的应用
java·面试·arthas
小红的布丁2 小时前
JVM 内存分配策略
java·jvm
赶路人儿3 小时前
mybatis传递多个不同类型的参数到mapper xml文件
java·mybatis