设计模式(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):享元模式

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

相关推荐
qfljg8 小时前
OpenRewrite 实战指南
java
Sylvia33.8 小时前
LOL实时数据接入深度解析:从WebSocket到完整数据模型
java·网络·python·websocket·网络协议
2601_9620715714 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww894911114 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
zww894911117 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设18 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳18 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥18 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
devpotato19 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
xcl092519 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·spring boot·需求分析