【23种设计模式之】6.适配器模式——简单理解及应用

练习源码:https://github.com/liaoooyx/Design-Patterns

大部分对适配器模式的描述都类似于:

  • 把一个类的接口变换成客户端所能接受的另一种接口,从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作。
  • 将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
  • 将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作

个人认为有些拗口,换个角度来描述比较容易理解:

程序中有一个接口,还有另一个不相关的类(没有实现该接口),适配器模式通过继承或聚合(作为成员变量)等方式,在不修改代码的前提下,让用户可以通过原接口间接使用另一个类的功能

(也就是上面3种描述所说的:“将一个类的接口变换成客户端所能接受的另一种接口”。实际上第一个接口是一个抽象的概念,不管有没有接口都无所谓,这里表达的意思是:“这个类跟第二个接口没关系,不是它的实现类”;而第二个接口,实际上是用户目前使用的接口,也是适配器模式里面要关注的接口)。

方法是:创建一个Adapter类,实现该接口,并继承该类(或用组合的方式)。

类适配器,对象适配器的应用理解:

  • 目前,有一个接口InterfaceA,里面声明了一个排序方法sort();该接口有许多实现类,如提供了冒泡排序的类BubbleSort等等。
  • 需求前:程序通过接口A进行操作:InterfaceA operator = new BubbleSort; operator.sort()
  • 现在有一个需求,要求程序使用二叉树排序,并且依然使用接口InterfaceA
  1. 现状1:程序中最初就有一个排序类提供二叉树排序Sort.binaryTreeSort(),但并非接口InterfaceA的实现类。
  2. 现状2:无法直接通过复制和粘贴操作来重用其中的代码(比如找不到该算法库的源代码),重新写一个实现类又显得没必要。
  3. 现状3:部分开发人员已经针对接口InterfaceA编程,如果再要求对该接口进行修改将导致大量代码需要修改。
  • 目标:不修改已有代码的前提下,让程序可以通过接口A使用二叉树排序(即,将Sort.binaryTreeSort()适配到InterfaceA中)
  • 需求后:程序通过接口A进行操作:InterfaceA operator = new Adapter(); operator.sort()
  • 其中的Adapter类就是适配器:适配器作为媒介,实现接口中的方法sort(),并在该方法内调用被适配类Sort的方法binarySort()。(最终实现上面的结果)
  1. 类的适配器实现:
    Class Adapter extends Sort Implements InterfaceA {
    
    	//实现InterfaceA接口的sort()方法
    	@Override 
    	public void sort() {
    	
    		//调用Sort类里面的二叉树排序方法
    		binaryTreeSort();
    	}
    }
    
  2. 对象的适配器模式
    Class Adapter Implements InterfaceA {
    
    	//通过组合,持有被适配类Sort的对象
    	private Sort sort = new Sort();
    	
    	//实现InterfaceA接口的sort()方法
    	@Override 
    	public void sort() {
    	
    		//调用Sort类里面的二叉树排序方法
    		sort.binaryTreeSort();
    	}
    }
    

接口适配器

  • (直接看该作者博客即可:https://www.cnblogs.com/V1haoge/p/6479118.html)
  • 想要使用接口中的某个或某些方法,但是接口中有太多方法,我们要使用时必须实现接口并实现其中的所有方法,可以使用抽象类来实现接口,并不对方法进行实现(仅置空),然后我们再继承这个抽象类来通过重写想用的方法的方式来实现。这个抽象类就是适配器。

概述

描述1:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。(来自:https://www.cnblogs.com/geek6/p/3951677.html)

描述2:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作(来自:https://www.cnblogs.com/songyaqi/p/4805820.html)

实现方法

  • 类的适配器模式:通过继承来实现适配器功能。
  • 对象的适配器模式:通过组合来实现适配器功能。
  • 接口的适配器模式:通过抽象类来实现适配,这种适配稍别于上面所述的适配。
    (来自:https://www.cnblogs.com/V1haoge/p/6479118.html)

适用场景
(来自:https://www.cnblogs.com/V1haoge/p/6479118.html)
类适配器对象适配器的使用场景一致,仅仅是实现手段稍有区别,二者主要用于如下场景:

  1. 想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
  2. 我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。

以上两个场景其实就是从两个角度来描述一类问题,那就是要访问的方法不在合适的接口里,一个从接口出发(被访问),一个从访问出发(主动访问)。

接口适配器

  1. 想要使用接口中的某个或某些方法,但是接口中有太多方法,我们要使用时必须实现接口并实现其中的所有方法,可以使用抽象类来实现接口,并不对方法进行实现(仅置空),然后我们再继承这个抽象类来通过重写想用的方法的方式来实现。这个抽象类就是适配器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值