问题导入:比如有A型螺母和B型螺母,那么用户可以再A型螺母上直接使用按着A型螺母生产的A型螺丝,同样也可以在B型螺母上直接使用按着B型螺母标准生产的B型螺丝。但是由于A型螺母和B型螺母的标准不一样,用户在A型螺母上不能直接使用B型的螺丝,反之也一样。该如何达到这个目的呢?
使用适配器就可以解决这个问题:生产一种“A型螺母适配器”,这种A型螺母适配器的前端符合A型螺母标准要求,可以拧在A型螺母上,后端又焊接了一个B型螺母。这样用户就可以借助A型螺母适配器在A型螺母上使用B型的螺丝了。
适配器模式又称为包装器,是用来将一个类的接口转换成客户希望的另外一个接口。这可以使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式的关键是建立一个适配器,这个适配器实现了目标接口并且包含了被适配者的引用。
适配器模式的三种角色:
一、目标:目标是一个接口,该接口是客户想要使用的接口。
二、被适配者:被适配者是一个已经存在的接口或抽象类,这个接口接口或者抽象类需要适配。
三、适配器:适配器是一个类,该类实现了目标接口并且包含有被适配者的引用,即适配器的职责是对适配者接口或抽象类与目标接口进行适配。
以下通过一个简单的问题来描述适配器模式中所涉及的各个角色。
用户已经有一个两厢的插座,但是最近用户又有了一个新的三厢插座。用户现有一台洗衣机和一台电视机,洗衣机是三厢插头,而电视机是两厢插头。现在用户想用心的三厢插座来使用洗衣机和电视机,即用心的三厢插座为洗衣机和电视机接通电流。
针对以上问题,使用适配器模式设计若干个类。
1.目标
本问题是使用三厢插座来为电视机和洗衣机接通电流,所以目标是三厢插座。把三厢插座设置为一个接口:
1 package com.adatpe; 2 3 //适配目标:三相插座 4 public interface ThreeElectricOutlet { 5 void connectElectricCurrent(); 6 }
2.被适配者
对于本问题,用户是想要用三厢插座为两厢插头的电视机接通电流,所以被适配者应该是两厢插座,也设置为一个接口:
1 package com.adatpe; 2 3 //被适配者:两相插座 4 public interface TwoElectricOutlet { 5 void connectElectricCurrent(); 6 }
3.适配器
该适配器实现了目标接口三厢插座ThreeElectricOutlet,同时又包含了两厢插座TwoElectricOutlet的引用:
1 package com.adatpe; 2 3 //适配器:实现目标接口 4 public class ThreeElectricAdapter implements ThreeElectricOutlet { 5 //适配器包含被适配者的引用 6 private TwoElectricOutlet outlet; 7 public ThreeElectricAdapter(TwoElectricOutlet outlet) { 8 this.outlet = outlet; 9 } 10 public void connectElectricCurrent() { 11 outlet.connectElectricCurrent(); 12 } 13 14 }
下列应用程序中,Application.java使用了适配器模式中所涉及的类,应用程序负责用Wash类创建一个对象来模拟一台洗衣机,使用TV类创建一个对象来模拟一台电视机
使用ThreeElectricOutlet接口变量调用Wash对象的connectElectricCurrent()方法,并借助适配器调用TV对象的connectElectricCurrent()方法,即用三厢插座分别为洗衣机和电视机接通电流。
1 package com.adatpe; 2 3 public class Application { 4 public static void main(String[] args) { 5 ThreeElectricOutlet outlet; //目标接口(三相插座) 6 Wash wash = new Wash(); //洗衣机 7 outlet = wash; //洗衣机插在三相插座上 8 System.out.println("使用三相插座接通电流"); 9 outlet.connectElectricCurrent(); //接通电流开始洗衣服 10 TV tv = new TV(); //电视机 11 ThreeElectricAdapter adapter = new ThreeElectricAdapter(tv); //把电视插在适配器上面 12 outlet = adapter; //再把适配器插在三厢插座上 13 System.out.println("使用三厢插座接通电流"); 14 outlet.connectElectricCurrent(); //接通电流,开始播放电视节目 15 } 16 } 17 18 //洗衣机使用三相插座 19 class Wash implements ThreeElectricOutlet{ 20 private String name; 21 public Wash() { 22 name = "黄河洗衣机"; 23 } 24 public Wash(String name){ 25 this.name = name; 26 } 27 public void connectElectricCurrent() { 28 turnOn(); 29 } 30 public void turnOn(){ 31 System.out.println(name+"开始洗衣服了"); 32 } 33 } 34 35 36 //电视机使用两厢插座 37 class TV implements TwoElectricOutlet{ 38 private String name; 39 public TV() { 40 name = "长江电视机"; 41 } 42 public TV(String name){ 43 this.name = name; 44 } 45 public void connectElectricCurrent() { 46 turnOn(); 47 } 48 public void turnOn(){ 49 System.out.println(name+"开始播放电视节目"); 50 } 51 52 }
运行结果为:
使用三相插座接通电流
黄河洗衣机开始洗衣服了
使用三厢插座接通电流
长江电视机开始播放电视节目
下面举个双向适配器的例子
在适配器模式中,如果Adapter角色同时实现目标接口和被适配者接口,并包含目标接口和被适配接口的引用,那么该适配器就是一个双向适配器。使用双向适配器,用户既可以用新的接口又可以用已有的接口。在以上例子中,如果用户希望能有三厢插座来接通洗衣机和电视机的电流,有可以用两厢插座来接通洗衣机和电视机的电流,那么就必须使用一个双向适配器。具体代码如下:
1 package com.adatpe; 2 3 public class ThreeAndTwoElectricAdapter implements ThreeElectricOutlet, 4 TwoElectricOutlet { 5 private ThreeElectricOutlet threeElectricOutlet; 6 private TwoElectricOutlet twoElectricOutlet; 7 public ThreeAndTwoElectricAdapter(ThreeElectricOutlet threeOutlet,TwoElectricOutlet twoOutlet) { 8 threeElectricOutlet = threeOutlet; 9 twoElectricOutlet = twoOutlet; 10 } 11 public ThreeAndTwoElectricAdapter(TwoElectricOutlet twoOutlet,ThreeElectricOutlet threeOutlet){ 12 threeElectricOutlet = threeOutlet; 13 twoElectricOutlet = twoOutlet; 14 } 15 public void connectElectricCurrent() { 16 if(this instanceof ThreeElectricOutlet){ 17 twoElectricOutlet.connectElectricCurrent();//twoElectricOutlet是被适配的接口 18 } 19 if(this instanceof TwoElectricOutlet){ 20 threeElectricOutlet.connectElectricCurrent(); //threeElectricOutlet是被适配的接口 21 } 22 } 23 public static void main(String[] args) { 24 ThreeElectricOutlet threeOutlet; 25 TwoElectricOutlet twOutlet; 26 Wash wash = new Wash(); 27 TV tv = new TV(); 28 ThreeAndTwoElectricAdapter adapter = new ThreeAndTwoElectricAdapter(wash,tv); 29 threeOutlet = adapter; 30 System.out.println("使用三厢插座接通电源"); 31 threeOutlet.connectElectricCurrent(); 32 twOutlet = adapter; 33 System.out.println("使用两厢插座接通电源"); 34 twOutlet.connectElectricCurrent(); 35 } 36 37 }
运行结果为:
使用三厢插座接通电源
长江电视机开始播放电视节目
黄河洗衣机开始洗衣服了
使用两厢插座接通电源
长江电视机开始播放电视节目
黄河洗衣机开始洗衣服了
这样就实现了即可以用三厢插座又可以用两厢插座来为电视机和洗衣机接通电流了。
使用适配器模式主要有以下优点:
1.目标和被适配者是完全解耦的关系。
2.适配器模式满足“开--闭原则”,当添加一个实现了Adapter接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。
相关推荐
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
基于java的学生网上请假系统的开题报告.docx
社会经济繁荣发展的今天,电子商务得到了飞速发展,网上交易越来越彰显出其独特的优越性,在人们的日常生活中,出现了各种类型的交易网站。其中一个就是车辆易主交易网站,它是一个服务于用户买卖二手车辆的交易网站,为用户提供了平等互利、方便快捷的网上交易平台,通过这一类型的网站,用户可自由出售和购买车辆。 本课题主要根据车辆本身的特性,充分发挥互联网的特点与优势,构建一个以二手车辆为商品、基于互联网平台的车辆易主业务交易管理系统,并根据车辆易主业务交易管理系统的应用需求,进行需求分析,进而对网站系统作规划设计。采用IDEA为运行平台,以SSH为框架,运用HTML语言、JSP技术、MySql数据库、JSP与后台数据库链接等关键技术建设二手车网上交易系统,构建车辆易主交易系统的会员注册与登录,网站首页展示、用户发布商品车辆,用户求购商品车辆,分页浏览、购物系统、用户后台管理、管理员用户后台管理等功能,并使这些功能得以实现并更好为用户服务。网站整体构建完成且测试成功后,用户可以进入网站进行注册、登录,登录后,用户可以在网站上发布自己的闲置车辆或者寻找想要购买的车辆,还可以收藏车辆,管理发布和收藏的车辆,
SQLite3的向量扩展库,windows dll,版本0.1.5
基于C++实现(控制台)商品库存管理系统