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

《java与模式》学习系列——适配器模式

 

一、 适配器模式的结构

适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式有类的适配器模式和对象的适配器模式两种形式。

类的适配器模式如下图所示:

对象的适配器模式结构如下:

适配器模式的用意是将接口不同而功能相同或相近的两个接口加以转换,这里面包括适配器角色补充了一个源角色没有的方法。读者不要误以为适配器模式就是为了补充源角色没有的方法而准备的。

二、 适配器的适用场景

1、系统需要使用现有的类,而此类的接口不符合系统的需要。

2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有复杂的接口。

3、对对象的适配器模式而言,在设计里,需要改变多个已有的子类接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器类,而这不太实际。

三、适配器模式在java中的应用

         JDBC驱动软件与适配器模式

 

 

缺省适配模式

缺省适配模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。很多情况下,必须让一个具体类实现某一个接口,但是这个类又用不到接口所规定的所有方法。可以用一个抽象类给出所有方法的平庸的具体实现,这样从这个抽象类再继承下去的子类就不必实现所有的方法了,而这就是缺省适配模式。

其结构图如下:

其源代码如下:

public interface AbstractServie{

         void serviceOperation1();

         int serviceOperation2();

         String serviceOperation3();

}

public class ServiceAdapter

         implements AbstractService

{

         public void serviceOperation1(){}

public int serviceOperation2(){ return 0;}

public String serviceOperation3(){return null;}

}

缺省适配模式的中心是一个缺省适配类。这个类应当是抽象类,因为这个类不应当实例化,它的实例也没有用处。但是这些方法不应是抽象的方法,因为按照模式的用意,这些方法之所以存在,就是为了提供默认实现,以便缺省适配类的具体子类可以按照需要只实现需要实现的方法,忽略不需要实现的方法。

jdk中当量使用缺省适配模式,在java2.0java.awt库中,缺省适配类有WindowAdapter, ComponentAdapter, ContainerAdapter, FocusAdapter, KeyAdapter, MouseAdapter, MouseMotionAdapter, WindowAdapter

 

相关文章:

  • javascript模板库jsrender加载并缓存外部模板文件
  • 《java与模式》学习系列——装饰模式
  • 初始化Git的配置
  • 《java与模式》学习系列——享元模式
  • Java WebService 简单实例
  • java.lang.instrument使用
  • 《java与模式》学习系列——门面模式
  • 《java与模式》学习系列——桥梁模式
  • 《java与模式》学习系列——观察者模式
  • angularjs服务-service
  • 《java与模式》学习系列——迭代子模式
  • Werkzeug工具包学习-官方例子Shortly分析
  • 《java与模式》学习系列——责任链模式
  • iOS中的交换空间(swap space)
  • 《java与模式》学习系列——命令模式
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【剑指offer】让抽象问题具体化
  • 【刷算法】求1+2+3+...+n
  • ESLint简单操作
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • iOS | NSProxy
  • Java 多线程编程之:notify 和 wait 用法
  • js学习笔记
  • Linux快速复制或删除大量小文件
  • mysql常用命令汇总
  • node.js
  • springMvc学习笔记(2)
  • 编写符合Python风格的对象
  • 反思总结然后整装待发
  • 码农张的Bug人生 - 见面之礼
  • 使用agvtool更改app version/build
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 用mpvue开发微信小程序
  • 原生Ajax
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #{} 和 ${}区别
  • (3)选择元素——(17)练习(Exercises)
  • (LeetCode C++)盛最多水的容器
  • (poj1.2.1)1970(筛选法模拟)
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .htaccess配置常用技巧
  • .NET Core中Emit的使用
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NetCore项目nginx发布
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @DataRedisTest测试redis从未如此丝滑
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [Django ]Django 的数据库操作
  • [IE技巧] 如何让IE 启动的时候不加载任何插件
  • [JavaScript]如何讓IE9, IE8, IE7, IE6關閉視窗時不彈出對話訊息