博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式之适配器模式(Adapter)
阅读量:5140 次
发布时间:2019-06-13

本文共 1729 字,大约阅读时间需要 5 分钟。

    通常,在代码已经存在的情况下编写客户端代码(客户端就是需要调用我们代码的对象),开发人员可以采取模拟客户端的方式调用我们提供的接口对象。然而,客户端代码也可能与你的代码单独进行开发,这种情况下,会发现虽然现有代码提供了客户端需要的服务,但被定义成不同的方法名。这时,我们就需要采用适配器模式。适配器模式的意图在于,使用不同接口的类所提供的服务为客户端提供它所需要的接口。

    适配器模式可分为两种:

  (1)类适配器

  (2)对象适配器

类适配器:

     当我们适配现有代码时,发现客户端开发人员已经考虑到了这种情形,开发人员为客户端使用的服务提供了接口定义。如下:

public interface RequiredInterface {    public void requiredMethod();}

RequiredInterface接口定义了客户端需要调用的服务方法requiredMethod,在ExsitingClass类中,则定义了usefulMethod方法,它是客户端需要的服务实现。

public class ExistingClass {    public void usefulMethod() {        System.out.println("useful method!!!");    }}

若要对ExistingClass进行适配,满足客户端需要,则可以创建一个NewClass类,继承ExistingClass,同时继承RequiredInterface接口,通过重写requiredMethod方法将客户端的请求委托给usefulMethod方法,如下:

public class NewClass extends ExistingClass implements RequiredInterface{    public void requiredMethod() {        this.usefulMethod();    }}

 

                                     图1

图1中的NewClass类就是类适配器的例子。该类的实例同时也是RequiredInterface的实例。换言之,NewClass类满足类客户端的需求。

 

当客户端在接口中定义了它所期待当行为时,就可以使用类适配器,提供一个实现该接口的类。倘若没有定义客户端的接口,则不能使用类适配器,此时必须使用对象适配器。在类适配器中,新的适配器类实现了定义的接口,同时继承现有类。当你需要适配的方法并非定义在接口中时,这种方法就不凑效类。此时我们可以创建一个对象适配器,使用委托而非继承,如下图所示:

 

上图中的NewClass是对象适配器的一个例子,该类的实例也是RequiredClass的实例,换言之,NewClass满足了客户端的需要。NewClass通过使用ExistingClass实例对象,可以将ExistingClass类适配为符合客户端的需要。

public class RequiredClass {    public void requiredMethod(){    }}public class NewClass extends RequiredClass {    private ExistingClass existingClass = new ExistingClass();    @Override    public void requiredMethod() {        existingClass.usefulMethod();    }}

     适配器模式可以是我们重用一个现有的类,以满足客户端的需要。当客户端通过接口表达其需求时,采用类适配器,创建一个实现该接口的类,同时继承现有类。 当客户端没有指定它所需要的接口时,应采用对象适配器,创建一个类使用现有类的实例。如果我们不需要(或者不能)重写客户端可能调用的方法时,这种方式可能存在一定的危险性。

 

转载于:https://www.cnblogs.com/will-shun/p/7401783.html

你可能感兴趣的文章
九校联考-DL24凉心模拟Day2T1 锻造(forging)
查看>>
Cortex M3/M4 学习摘要(二)
查看>>
C#时间的味道——任时光匆匆我只在乎你
查看>>
(1)数据结构——线性表(数组)实现
查看>>
SpringMyBatis解析2-SqlSessionFactoryBean
查看>>
按照excel文档中的内容在当前cad图纸中自动排布实体
查看>>
Winform开发框架之图表报表在线设计器2-图表-SNF.EasyQuery项目--SNF快速开发平台3.3-Spring.Net.Framework...
查看>>
C#基础第八天-作业-设计类-面向对象方式实现两个帐户之间转账
查看>>
洛谷 P3237 [HNOI2014]米特运输
查看>>
Attributes.Add用途与用法
查看>>
JavaScript面向对象初探——封装和继承
查看>>
L2-001 紧急救援 (dijkstra+dfs回溯路径)
查看>>
【概率】poj 2096:Collecting Bugs
查看>>
javascript 无限分类
查看>>
【自制插件】MMD4Maya
查看>>
解决linux服务器乱码
查看>>
mapbox.gl文字标注算法基本介绍
查看>>
【C++】异常简述(二):C++的异常处理机制
查看>>
web.config在哪里
查看>>
SQL Server 2000 版本支持的最大物理内存量
查看>>