一、适配器模式介绍

适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

例如:

NBA中的球员来自不同国家,而世界标准语言是英语。那他们不会英语,也不能各自学习所有国家的语言。所以,最好的办法就是请不同的翻译

将这些球员国家的语言翻译成英语。而这些翻译就是适配器

适配器模式分类:

1、类适配器模式(不推荐使用):由于类适配器模式需要多重继承对一个接口对另一个接口进行适配,而C#,Java不支持多重继承。

2、对象适配器模式:采用组合的方式

二、适配器模式代码实现

2.1 类适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
 * 需要被适配的类(各个球员)
 */
public class Adaptee {
    public void request(){
        System.out.println("请求通过");
    }
}
/**
 * 适配器接口:翻译的一个接口
 */
public interface Target {
    void handleReq();
}
/**
 * 具体的适配器的实现(相当于各国的翻译)
 */
public class Adapter extends Adaptee implements Target{
    //这里需要和被适配对象关联起来:1.继承   2.组合(推荐)
    private Adaptee adaptee;
    @Override
    public void handleReq() {
        super.request();
    }  
}
 
/**
 * 测试对象适配器模式
 */
public class Client {
    //说话
    public void test1(Target t){
        t.handleReq();
    }
    public static void main(String[] args) {
        Client c = new Client();
        Adaptee a = new Adaptee();
        Target t = new Adapter();
        c.test1(t);
    }
}

结果是控制台打印:请求通过

2.2 对象适配器

由于类适配器中只能继承一个被需要适配的对象,则不推荐使用。

要使用对象适配器,只需要使用组合即可。修改适配器实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
 * 需要被适配的类(各个球员)
 */
public class Adaptee {
    public void request(){
        System.out.println("请求通过");
    }
}
/**
 * 适配器接口:翻译的一个接口
 */
public interface Target {
    void handleReq();
}
/**
 * 具体的适配器的实现(相当于各国的翻译)
 */
public class Adapter implements Target{
    //这里需要和被适配对象关联起来:1.继承   2.组合(推荐)
    private Adaptee adaptee;//这里使用组合
    @Override
    public void handleReq() {
        adaptee.request();
    }
    public Adapter(Adaptee adaptee) {//在构造器中构造被适配的对象
        super();
        this.adaptee = adaptee;
    }
}
  
/**
 * 测试对象适配器模式
 */
public class Client {
    //说话
    public void test1(Target t){
        t.handleReq();
    }
    public static void main(String[] args) {
        Client c = new Client();
        Adaptee a = new Adaptee();
        Target t = new Adapter(a);//需要传入适配器
        c.test1(t);
    }
}

三、总结

适配器模式应用场景:

java.io.InputStreamReader(InputStream)

java.io.OutputStreamWriter(OutputStream)

Java23种设计模式学习笔记【目录总贴】

参考资料:

  大话设计模式(带目录完整版).pdf

  HEAD_FIRST设计模式(中文版).pdf

  尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】

适配器模式(Adpater)的更多相关文章

  1. 适配器模式(Adpater Pattern)

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极.阴极 ...

  2. [设计模式] 7 适配器模式 adapter

    在 Adapter 模式的结构图中可以看到,类模式的 Adapter 采用继承的方式复用 Adaptee的接口,而在对象模式的 Adapter 中我们则采用组合的方式实现 Adaptee 的复用 类模 ...

  3. 兼容性:Adapter(适配器模式)【PHP】

    Adapter(适配器模式) ---- 加个“适配器”以便于复用 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景 如果 ...

  4. 设计模式 结构型 - 适配器模式 Adapter

    Adapter(适配器模式) ---- 加个“适配器”以便于复用 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景 如果 ...

  5. PHP设计模式(七)适配器模式(Adapter For PHP)

    适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 如下图(借图): // 设置书的接口 // 书接口 interface BookI ...

  6. 《JS设计模式笔记》 5,适配器模式

    //适配器模式的作用就像一个转接口. jQuery("#"+id); $id=function (id) { return jQuery("#"+id)[0]; ...

  7. 设计模式(七): 通过转接头来观察"适配器模式"(Adapter Pattern)

    在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern).适配器模式用处还是比较多的,如果你对“适配器模式”理解呢,那么自 ...

  8. 设计模式(七)适配器模式(Adapter Pattern)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  9. PHP 适配器模式

    适配器模式(Adapter)模式:将一个类的接口,转换成客户期望的另一个类的接口.适配器让原本接口不兼容的类可以合作无间.     [适配器模式中主要角色]目标(Target)角色:定义客户端使用的与 ...

随机推荐

  1. C++中explicit的用法

    https://blog.csdn.net/qq_35524916/article/details/58178072 https://blog.csdn.net/jinjin1062495199/ar ...

  2. Bootstrap的js插件之折叠(collapse)

    data-toggle="collapse"--指明该元素具有折叠功能: data-target--设置元素打开折叠后指向的元素链接. .collapse--用来设置元素为折叠内容 ...

  3. CXSprite.h文件

    #ifndef __XSprite_H__ #define __XSprite_H__ #include "CocoHead.h" #define BTN_FRAME_AMOUNT ...

  4. 每日英语:China Targets Big Pharma

    China unveiled a litany of bribery and misconduct allegations against GlaxoSmithKline GSK.LN -0.26% ...

  5. 认识rem

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. vuex中store分文件时候index.js进行文件整合

    import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex); import getters from './getters.js' impo ...

  7. CEF Xilium.CefGlue 在当前窗体中打开全部链接(防止弹窗)

    我们在使用Xilium.CefGlue编写浏览器应用程序时.对于嵌入的网页假设有链接会在新窗体打开.这种用户体验会非常差.因此我们须要改动程序,使全部链接都在当前窗体中打开. 首先引用Xilium.C ...

  8. 应用DataAdapter对象填充DataSet数据集

    private void Form1_Load(object sender, EventArgs e) { string strCon = "Server=localhost;User Id ...

  9. linux - native task api 测试

    #include <stdio.h>#include <signal.h>#include <unistd.h>#include <sys/mman.h> ...

  10. API - 使用数据仓库 - 基础篇

    数据仓库是集成在Spider Studio中的一个重要功能, 利用它可以非常方便的保存采集到的数据, 然后导出或者在其他脚本中再利用. 数据仓库的全部功能都集成在DataManager这个静态类里面, ...