当前位置: 首页 > news >正文

设计模式简述(十三)适配器模式

适配器模式

  • 描述
    • 基本使用
    • 使用
    • 关于适配器关联不兼容类的方式
      • 如果原有抽象层是抽象类
      • 若原有抽象是接口
        • 使用

描述

适配器模式常用于系统已经上限稳定运行,但现有需求需要将两个不匹配的类放到一起工作时使用。

也就是说这是一个迭代阶段使用的模式。
这种模式,正应了那句软件领域的名言:没有什么是加一层解决不了的

基本使用

要实现适配器模式,原有系统类需存在抽象层,否则无从谈起

  • 定义原有抽象层(可以是抽象类、接口)
public abstract class AbstractService {abstract void execute();
}
  • 定义原有业务类
public class DefaultService extends AbstractService {@Overridevoid execute() {System.out.println("DefaultService.....");}
}
  • 外来不兼容类
public class Adaptee {public void action() {System.out.println("外来的不兼容对象....");}
}
  • 适配器
public class Adapter extends AbstractService {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridevoid execute() {adaptee.action();}
}

使用

public class Sample {public static void main(String[] args) {Sample sample = new Sample();// 原有兼容类的调用sample.function(new DefaultService());System.out.println("========== 不兼容类的调用 ======");// 外来不兼容对象Adaptee adaptee = new Adaptee();// 适配器对象AbstractService service = new Adapter(adaptee);// 将适配器对象传入方法sample.function(service);}/*** 原本的方法只接收 AbstractService 类型参数* 如果直接将Adaptee传入是不行的,因此我们加了一层中间层 Adapter* @param service*/private void function(AbstractService service) {service.execute();}
}

关于适配器关联不兼容类的方式

如果原有抽象层是抽象类

也就是适配器只能通过继承的方式实现原有逻辑时,不兼容类只能通过成员的方式关联到适配器
也就是上面的方式

public class Adapter extends AbstractService {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridevoid execute() {adaptee.action();}
}

若原有抽象是接口

那么不兼容类除了成员的方式关联外。适配器还可以继承不兼容的类

  • 定义原有抽象层
public interface IService {void execute();
}
  • 定义适配器
public class Adapter extends Adaptee implements IService {@Overridepublic void execute() {action();}
}
使用

在得到不兼容对象后,先将其转为适配器对象,再将其传入原有接口

public class Sample {public static void main(String[] args) {Sample sample = new Sample();// 原有兼容类的调用sample.function(new DefaultService());System.out.println("========== 不兼容类的调用 ======");Adaptee adaptee = new Adaptee();// 自定义方式将 adaptee 转换成 AdapterAdapter adapter = sample.convert(adaptee);// 将适配器对象传入方法sample.function(adapter);}private Adapter convert(Adaptee adaptee) {// 自定义转换方法return new Adapter();}/*** 原本的方法只接收 AbstractService 类型参数* 如果直接将Adaptee传入是不行的,因此我们加了一层中间层 Adapter* @param service*/private void function(IService service) {service.execute();}
}

http://www.mrgr.cn/news/97319.html

相关文章:

  • 高频面试题(含笔试高频算法整理)基本总结回顾65
  • Spring 中的 @Autowired 和 @Resource
  • 美国mlb与韩国mlb的关系·棒球9号位
  • 计算机系统---UEFI(统一可扩展固件接口)
  • 开源软件与自由软件:一场理念与实践的交锋
  • Spring 中有哪些设计模式?
  • QT6(9)2.4:用 cmake 构建项目:整体介绍与 cmake 语法,cmake 不支持中文,依据QT帮助为 cmake文件添加模块,ui_dialog.h 头文件的位置有变化,更改与完善代码
  • C# Winform 入门(13)之通过WebServer查询天气预报
  • 定时器的实现方案:红黑树、最小堆与时间轮
  • 自动化备份全网服务器数据平台
  • go简化版面试题
  • 蓝桥杯高频考点——经典01背包问题详解(附例题)
  • Java 常用数据结构详解
  • Business English Certificates (BEC) 高频词汇背诵
  • 【NLP 54、大模型训练相关知识】
  • Android学习总结之handler源码级
  • Android学习总结之Kotlin 协程
  • LeetCode算法题(Go语言实现)_31
  • C++自学笔记---数组和指针的异同点
  • 【计算机网络】Linux配置SNAT/DNAT策略