适配接口 java_【Java 设计模式】接口型模式--Adapter(适配器)模式

简介:【Java设计模式】接口型模式–Adapter(适配器)模式Adapter模式的宗旨就是:向客户提供接口,并使用现有的类所提供的服务,以满足客户的需求。 或者说,现在有classA的方法满足客户的部分要求,将另一部分需求抽象

【Java 设计模式】接口型模式–Adapter(适配器)模式Adapter模式的宗旨就是:向客户提供接口,并使用现有的类所提供的服务,以满足客户的需求。

或者说,现在有class A的方法满足客户的部分要求,将另一部分需求抽象为interface B,那么就要有Adapter来使得class A和interface B相互结合,满足客户全部需求。通俗的理解:在party上,我想去搭讪一个女生Jerry。但是我的英语很烂,于是我拿了个翻译器,翻译器就是我和Jerry之间的Adapter,让我和Jerry可以很好的交谈。一,类适配器

862df7bc6a5da9e6d7a1b13613d6aa61.png示例代码public interface RequiredInterface {/*** 这是客户需要的方法*/public void requireMethod();}123456public class ExistingClass {/*** 这是现有的方法*/public void usefulMethod(){}}1234567适配器角色Adapter扩展了ExistingClass ,同时又实现了RequiredInterface 接口。由于ExistingClass 没有提供requireMethod()方法,而RequiredInterface 又要求这个方法,因此适配器角色Adapter实现了这个方法。public class Adapter extends ExistingClass implements RequiredInterface {/*** 由于源类ExistingClass没有方法requireMethod()* 因此适配器补充上这个方法*/@Overridepublic void requireMethod() {//写相关的代码}}12345678910二,对象适配器 

类适配器通过创建子类来实现适配,在设计类适配器的时候,新的适配器类可以实现期望的接口,并扩展已有的类。而对象适配器则是用委托的方式。

有两种方式,一种是实现接口的方式,一种是继承类的方式。

实现目标接口

e3778d669667467cbbdd561770f5fe51.png 

示例代码public interface RequiredInterface {/*** 这是客户需要的方法*/public void requireMethod();}123456public class ExistingClass {/*** 这是现有的方法*/public void usefulMethod(){}}1234567public class Adapter implements RequiredInterface{private ExistingClass exist;public Adapter(ExistingClass exist){this.exist = exist;}/*** 源类ExistingClass有方法usefulMethod* 因此适配器类直接委派即可*/public void usefulMethod(){this.exist.usefulMethod();}/*** 由于源类ExistingClass没有方法requireMethod()* 因此适配器补充上这个方法*/@Overridepublic void requireMethod() {//写相关的代码}}12345678910111213141516171819202122继承目标类

a7e741ed44f1f2d09a3628287440a71a.png 

示例代码public class RequiredClass {/*** 这是客户需要的方法*/public void requireMethod();}123456public class ExistingClass {/*** 这是现有的方法*/public void usefulMethod(){}}1234567public class Adapter extends RequiredClass {private ExistingClass exist;public Adapter(ExistingClass exist){this.exist = exist;}/*** 源类ExistingClass有方法usefulMethod* 因此适配器类直接委派即可*/public void usefulMethod(){this.exist.usefulMethod();}/*** 由于源类ExistingClass没有方法requireMethod()* 因此适配器补充上这个方法*/public void requireMethod() {//写相关的代码}}123456789101112131415161718192021三,接口的适配器模式

接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,

此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。

02678276efa2d2c9473d5fde21474e58.png示例代码public interface RequiredInterface{public void requireMethod1();public void requireMethod2();} 12345public abstract class AbstractRequiredClass implements RequiredInterface{public void requireMethod1(){}public void requireMethod2(){}} 12345public class Adapter1 extends AbstractRequiredClass {public void requireMethod1(){System.out.println("the RequiredInterface interface's first requireMethod1!");}} 12345public class Adapter2 extends AbstractRequiredClass {public void requireMethod2(){System.out.println("the RequiredInterface interface's first requireMethod2!");}} 12345个人觉得适配器模式中的这三种模式是挺灵活的,比如:复用性,系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。还有扩展性在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。 

不过在使用适配器时,也要注意到除非对系统的架构很清楚,否则过多的使用适配器,会让系统非常零乱,不易整体进行把握。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

deepinu盘制作工具_u盘启动盘制作工具怎么制作 u盘启动盘制作工具制作方法【详细步骤】...

在电脑城很多技术人员都会使用u盘装系统的方法给用户电脑安装系统,他们是怎么操作的呢?其实很简单,就是通过u盘启动盘来安装系统的。而u盘启动盘是需要用 u盘启动盘制作工具 来制作的。那么问题又来了,u盘启动盘制作工具怎么制作呢?下面就给…

openstack私有云_OpenStack-下一代私有云的未来

openstack私有云The OpenStack project is an open source cloud computing platform for all types of clouds, which aims to be simple to implement, massively scalable, and feature rich. Developers and cloud computing technologists from around the world create t…

outlook2010客户端无法预览及保存word,excel问题

outlook2010客户端遇到的EXCEL预览及保存问题今天遇到了一个这样的问题,outlook2010打开以后其他的excel都可以打开预览及保存,这个excel无法预览既保存,经查是outlook2010预览及打开的缓存有限制,超过后就无法预览了,…

python自动化框架pytest pdf_Python 自动化测试框架 unittest 和 pytest 对比

一、用例编写规则1.unittest提供了test cases、test suites、test fixtures、test runner相关的类,让测试更加明确、方便、可控。使用unittest编写用例,必须遵守以下规则:(1)测试文件必须先import unittest(2)测试类必须继承unittest.TestCase(3)测试方法必须以“test_”开头(4…

freemarker的测试结果框架_java必背综合知识点总结(框架篇)

框架篇一、Struts1的运行原理在启动时通过前端总控制器ActionServlet加载struts-config.xml并进行解析,当用户在jsp页面发送请求被struts1的核心控制器ActionServlet接收,ActionServlet在用户请求时将请求参数放到对应的ActionForm对象中的成员变量中&am…

Java SecurityManager checkPackageDefinition()方法与示例

SecurityManager类的checkPackageDefinition()方法 (SecurityManager Class checkPackageDefinition() method) checkPackageDefinition() method is available in java.lang package. checkPackageDefinition()方法在java.lang包中可用。 We call getProperty("package.d…

java容器详解_详解Java 容器(第①篇)——概览

![](http://img.blog.itpub.net/blog/2020/04/02/9d89d3008962c127.png?x-oss-processstyle/bb)容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。# 一、Collection![](https://upload-images…

python图形界面库哪个好_8个必备的Python GUI库

Python GUI 库有很多,下面给大家罗列常用的几种 GUI库。下面介绍的这些GUI框架,能满足大部分开发人员的需要,你可以根据自己的需求,选择合适的GUI库。1. wxPython wxPython 是一个跨平台的 GUI 工具集,是 Python 语言的…

为什么在Python中使用string.join(list)而不是list.join(string)?

join() is a string method and while using it the separator string iterates over an arbitrary sequence, forming string representations of each of the elements, inserting itself between the elements. join()是一个字符串方法,使用它时,分隔…

js的client、scroll、offset详解与兼容性

clientWidth:可视区宽说明:样式宽padding参考:js的client详解 scrollTop : 滚动条滚动距离说明:chrome下他会以为滚动条是文档元素的,所以需要做兼容:var scrollTop document.documentElement.scrollTop |…

88是python语言的整数类型_Python基础数据类型题

Python基础数据类型 题 考试时间:三个小时 满分100分(80分以上包含80分及格) 1,简述变量命名规范(3分)1.必须是字母,数字,下划线的任意组合。 2.不能是数字开头 3.不能是python中的关…

[转载]使用awk进行数字计算,保留指定位小数

对于在Shell中进行数字的计算,其实方法有很多,但是常用的方法都有其弱点: 1、bc bc应该是最常用的Linux中计算器了,简单方便,支持浮点。 [wangdongcentos715-node1 ~]$ echo 12 |bc 3 [wangdongcentos715-node1 ~]$ ec…

dcom配置_spring cloud 二代架构依赖组件 全配置放送

一 背景介绍先来看一下我们熟悉的第一代 spring cloud 的组件spring cloud 现在已经是一种标准了,各公司可以基于它的编程模型编写自己的组件 ,比如Netflix、阿里巴巴都有自己的一套通过spring cloud 编程模型开发的分布式服务组件 。Spring Cloud 二代组…

olap 多维分析_OLAP(在线分析处理)| OLAP多维数据集和操作

olap 多维分析In the previous article of OLAP, we have seen various applications of OLAP, Various types of OLAP, advantages, and disadvantages of OLAP. In this article, we will learn about the, 在OLAP的上一篇文章中,我们了解了OLAP的各种应用&#x…

dede mysql语句_让dede运行php代码和mysql语句

一、dede运行php代码举例1:{dede:name runphpyes}$str "hello ";me $str;me . "world";{/dede:name}结果:hello world说明:"name"为任意定义的名字,me 表示当前的值,也就是要输出最后…

每周一书-2016年8月28日到9月4日获奖读者公布

每周一书-2016年8月28日到9月4日获奖读者公布 上次送出的《Bootstrap基础教程》,已经被幸运者收到了。我们先来回顾下《改善C程序代码的125个建议》活动文章下的精彩留言。 这是一段高屋建瓴的评述,足见作者对C语言的了解和热爱层度,当然也得…

c构造函数和析构函数_C ++构造函数和析构函数| 查找输出程序| 套装2

c构造函数和析构函数Program 1: 程序1&#xff1a; #include<iostream>using namespace std;class Sample{private:int X;int Y;public:Sample(int x, int y){X x;Y y;}void set(int x, int y){X x;Y y;}void print(){cout<<X<<" "<<Y&…

python map函数的作用_Python的map函数

map()是 Python 内置的高阶函数&#xff0c;它接收一个函数 f 和一个 list&#xff0c;并通过把函数 f 依次作用在 list 的每个元素上&#xff0c;得到一个新的 list 并返回。 例如&#xff0c;对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个元素都作平方&#xf…

idea java no sdk_java - intelliJ IDEA 13错误:请选择Android SDK

java - intelliJ IDEA 13错误&#xff1a;请选择Android SDK我已经在Error: Cannot find any configured Android SDK上安装了intelliJ 12.1.2和Error: Cannot find any configured Android SDK。现在我使用intelliJ 13.0.1创建了一个空的android应用程序项目(也使用模拟器作为…

该怎样在KeyShot中进行贴图

2019独角兽企业重金招聘Python工程师标准>>> 在渲染物体的时候&#xff0c;贴图常常是不可缺少的部分&#xff0c;贴图主要用于描述对象表面的物质形态&#xff0c;构造真实世界中自然物质表面的视觉表象。不同的贴图能给人带来不同的视觉感受&#xff0c;KeyShot3D…