不兼容结构的协调——适配器模式(三)

类适配器

除了对象适配器模式之外,适配器模式还有一种形式,那就是类适配器模式,类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系,类适配器模式结构如图所示:

根据类适配器模式结构图,适配器类实现了抽象目标类接口 Target,并继承了适配者类,在适配器类的 request() 方法中调用所继承的适配者类的 specificRequest() 方法,实现了适配。

典型的类适配器代码如下所示:

class Adapter extends Adaptee implements Target {

public void request() {

specificRequest();

}

}

由于 Java、C# 等语言不支持多重类继承,因此类适配器的使用受到很多限制,例如如果目标抽象类 Target 不是接口,而是一个类,就无法使用类适配器;此外,如果适配者 Adapter 为最终(Final)类,也无法使用类适配器。在 Java 等面向对象编程语言中,大部分情况下我们使用的是对象适配器,类适配器较少使用。

思考

在类适配器中,一个适配器能否适配多个适配者?如果能,应该如何实现?如果不能,请说明原因?

双向适配器

在对象适配器的使用过程中,如果在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,那么该适配器就是一个双向适配器,其结构示意图如图所示:

双向适配器的实现较为复杂,其典型代码如下所示:

class Adapter implements Target,Adaptee {

//同时维持对抽象目标类和适配者的引用

private Target target;

private Adaptee adaptee;

public Adapter(Target target) {

this.target = target;

}

public Adapter(Adaptee adaptee) {

this.adaptee = adaptee;

}

public void request() {

adaptee.specificRequest();

}

public void specificRequest() {

target.request();

}

}

在实际开发中,我们很少使用双向适配器。

双向适配器 java_类适配器,双向适配器相关推荐

  1. 设计模式七:Adapter(适配器)——类对象结构型模式

    结构型模式: 结构型模式设计到如何组织类和对象以获得更大的结构. 结构型类模式: 采用继承机制来组合接口或实现.简单的例子是采用多重继承,这一模式尤其有助于多个独立开发的类库协同工作. 结构型对象模式 ...

  2. C++设计模式——适配器模式(对象适配器、类适配器)

    http://blog.jobbole.com/109381/?winzoom=1 前言 现在的笔记本都只存在USB接口,用来口,电脑上存在的是USB接口,两者如何通信呢?可以使用USB转串口线连接电 ...

  3. Adapter(适配器)--类对象结构型模式

    Adapter(适配器)–类对象结构型模式 一.意图 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本接口不兼容而不能一起工作的那些类可以一起工作. 二.动机 1.在软件系统中, ...

  4. 如何定义适配器adapter类_设计模式22-Adapter(适配器)模式-组件接口适配

    在软件开发过程中,有时候系统的数据和行为都正确,但接口不符合,这时候我们就应该考虑使用适配器模式,适配器的作用即将一个类的接口转换成客户希望的另外一个接口.它使得原本由于接口不兼容而不能一起工作的那些 ...

  5. 论AEM K50有多少种适配器?8类线网线适配器是标配

    众所周知,通讯线缆有很多种,适配于各行各业. 1,比如我们日常常见常用的双绞线,细心的朋友会发现通常在其线体上有标注:cat5e,cat6,cat6a,cat8等.其标号分别代表此线缆所能达到的通讯等 ...

  6. 浅谈迷宫搜索类的双向bfs问题(例题解析)

    文章目录 前言 bfs类问题 双向bfs 例题实战 前言 文章若有疏忽还请指正,更多精彩还请关注公众号:bigsai 在搜索问题中,以迷宫问题最具有代表性,无论是八皇后的回溯问题,还是dfs找出口,b ...

  7. 直流与交流电源适配器的差异?电源适配器类型

    目前,大多数电源适配器与我们的常见路由器是交流输出,而直流输出几乎是不存在的.那么交流和直流电哪个更有利呢? 一.直流和交流电源适配器之间的差异 普通的交流电源适配器(以下简称交流电源)通常用AC符号 ...

  8. python 双向循环链表实现_python实现双向循环链表基本结构及其基本方法

    双向循环链表是在双向链表的基础上发展的,双向链表的最后一个节点指向起始节点,起始节点的上一个节点指向最后一个节点,就得到双向循环链表. 双向循环链表比双向链表具有更多的优势,节点的增加和删除有很多优化 ...

  9. httos双向认证配置_APP爬虫双向认证抓包的两种方法

    APP抓包相对繁琐,越来越多的 APP 在 https 请求和响应时,为了防止中间人攻击(或中间人抓包),会做证书认证,让抓包工具抓不到请求.证书认证分单向认证和双向认证,双向认证是相较于单向认证而言 ...

最新文章

  1. ssm开发框架原理_SSM 单体框架 - 前端开发:视频讲解
  2. [算法][递归] 棋盘覆盖
  3. Ubuntu16.04下Hadoop的本地安装与配置
  4. linux proc 占用空间,一种诡异的Linux磁盘空间被占满问题
  5. Fiddler抓包使用教程-基本功能介绍
  6. Struts2 文件上传,下载,删除
  7. 集合计数 (容斥原理)
  8. Rabbitmq 1.消息如何保障 100%投递成功?
  9. 什么是devops开发运维_为什么假设驱动的开发是DevOps的关键
  10. illustrator 连接功能
  11. (27)FPGA面试题动态时序模拟
  12. 类GeometricShapeFactory-JTS几何图形绘制API
  13. php四则运算出题器_PHP实现的简单四则运算计算器功能示例
  14. Python实现主成分分析(PCA)降维:原理及实例分析
  15. Beaglebone移植DDS模块驱动(AD9833)
  16. C++程序设计课程主页-2015级
  17. 网站建设设计具体服务内容
  18. 成都拓嘉辰丰:拼多多子账号建立的方法?
  19. 一本书,一个软件思想和创意的T台大道
  20. 高级JavaScript Day03 | 函数定义和调用、this、严格模式、高阶函数、闭包、递归

热门文章

  1. 【安全攻防知识-3】学习平台搭建汇总
  2. 5、DML语句(数据操纵语言-增删改查)
  3. Xib文件使用(一)——xib文件解析
  4. optics算法matlab实现,OPTICS聚类算法的matlab实现
  5. js数组中__ob__: Observer属性
  6. 2023年渗透测试都需要学习哪些内容?
  7. 网络七层协议:OSI七层协议大白话解读
  8. JAVA实现篮球计分计时器
  9. VMware虚拟机中设置端口映射
  10. echarts改变字体颜色