1.概念: 
  适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 
2.形式 
  a.类的适配器模式 b.对象的适配器模式 c.缺省适配器模式

3. 模式中的角色

  3.1 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

  3.2 需要适配的类(Adaptee):需要适配的类或适配者类。

  3.3 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。 

4.适配器模式的类图

  4.1 类的适配器模式:采用继承实现

  4.2 对象的适配器模式:采用对象组合方式实现

  4.3 缺省适配器模式:采用抽象类过渡实现

5 类的适配器设计模式

类适配器,因为 Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口,在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。

  Interface : Target

package edu.gof.adapter.class_;

//目标接口,或称为标准接口
public interface Target { public void request();
}

  Class : Adaptee

package edu.gof.adapter.class_;

//已存在的、具有特殊功能、但不符合我们既有的标准接口的类
public class Adaptee { public void specificRequest(){
System.out.println("被适配的类具有的 特殊功能...");
} }

  Class : ConcreteTarget

package edu.gof.adapter.class_;

//具体目标类,只提供普通功能
public class ConcreteTarget implements Target { public void request() {
System.out.println("普通类 具有 普通功能...");
} }

  Class : Adapter

package edu.gof.adapter.class_;

//适配器类,继承了被适配类,同时实现标准接口
public class Adapter extends Adaptee implements Target{ public void request() {
super.specificRequest();
} }

  Class : AdapterTest

package edu.gof.adapter.class_;

public class AdapterTest {

    public static void main(String[] args) {
Target clientA = new ConcreteTarget();
clientA.request(); Target clientB = new Adapter();
clientB.request();
} }

  Console :

普通类 具有  普通功能...
被适配的类具有的 特殊功能...

6.对象的适配器设计模式

对象适配器模式,可以使得 Adapter 类(适配类)根据传入的 Adaptee 对象达到适配多个不同被适配类的功能。

  Interface :Target

package edu.gof.adapter.object_;

public interface Target {

    public void request();
}

  Class : Adatee

package edu.gof.adapter.object_;

public class Adaptee {

    public void specificRequest(){
System.out.println("被适配类 具有 特殊功能...");
}
}

  Class :ConcreteTarget

package edu.gof.adapter.object_;

public class ConcreteTarget implements Target {

    public void request() {
System.out.println("普通类 具有 普通功能...");
} }

  Class : Adapter

package edu.gof.adapter.object_;

public class Adapter implements Target{
// 直接关联被适配类
private Adaptee adaptee; public Adapter() {
super();
}
// 可以通过构造函数传入具体需要适配的被适配类对象
public Adapter(Adaptee adaptee) {
super();
this.adaptee = adaptee;
} public void request() {
// 这里是使用委托的方式完成特殊功能
this.adaptee.specificRequest();
} }

  Class :AdapterTest

package edu.gof.adapter.object_;

public class AdapterTest {

    public static void main(String[] args){
Target clientA = new ConcreteTarget();
clientA.request(); Target clientB = new Adapter(new Adaptee());
clientB.request();
}
}

  Console :

普通类 具有 普通功能...
被适配类 具有 特殊功能...

7.缺省适配器设计模式

缺省适配(Default Adapter)模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。作为适配器模式的一个特例,缺省是适配模式在JAVA语言中有着特殊的应用。

  Interface :Target

package edu.gof.adapter.abstract_;

public interface Target {

    public void request();

    public void response();

}

  Class : AbstractTarget

package edu.gof.adapter.abstract_;

public class AbstractTarget implements Target{

    public void request() {
// TODO Auto-generated method stub } public void response() {
// TODO Auto-generated method stub }
}

  Class :Adapter

package edu.gof.adapter.abstract_;

public class Adapter extends AbstractTarget {

    public void request(){
System.out.println("适配器类 只适配 需要的 功能...");
}
}

  Class : AdapterTest

package edu.gof.adapter.abstract_;

public class AdapterTest {

    public static void main(String[] args){
Target clientA = new Adapter();
clientA.request();
clientA.response();
}
}

  Console :

适配器类 只适配 需要的 功能...

啦啦啦

啦啦啦

啦啦啦

GoF--适配器设计模式的更多相关文章

  1. Java适配器设计模式

    适配器设计模式,一个接口首先被一个抽象类先实现(此抽象类通常称为适配器类),并在此抽象类中实现若干方法(但是这个抽象类中的方法体是空的),则以后的子类直接继承此抽象类,就可以有选择地覆写所需要的方法. ...

  2. 猿取向的规划设计模式 ——GoF《设计模式》阅读摘要(零)

    这个话题是很奇怪,设计模式是引导程序的设计不是模仿什么软件?呃.我的意思是,这是 面"对象"相对的设计模式. 我曾见过有人写<给妻子解释设计模式>,这样的把计算机中的思 ...

  3. [gkk]传智-适配器设计模式,如同电源适配器

    //适配器设计模式 是图形化设计中用的.如同电源适配器 import java.awt.*; inport java.awte public calss MyFrame{ public static ...

  4. JAVA基础—适配器设计模式

    适配器概念 在计算机编程中,适配器模式将一个类的接口适配成用户所期待的.使用适配器,可以使接口不兼容而无法在一起工作的类协调工作,做法是将类自己包裹在一个已经存在的类中. JDK对适配器设计模式的应用 ...

  5. Java设计模式之适配器设计模式(项目升级案例)

    今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一 ...

  6. IOS设计模式第六篇之适配器设计模式

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 那么怎么使用适配器设计模式呢? 这个之前提到的水平滚动的视图像这样: 为了开始实现他,我们创建一个新的继承与UIView的HorizontalScr ...

  7. 适配器设计模式初探(Java实现)

    本篇随笔主要介绍Java实现设配器设计模式. 先来看下待解决的问题: (图片转自http://blog.csdn.net/jason0539) 由上图的情况可知,欧洲壁式插座只有三足插口,如果我们想要 ...

  8. Design Pattern Adaptor 适配器设计模式

    适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一. 就是这种一个图: watermark/2/text ...

  9. 实践GoF的设计模式:迭代器模式

    摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:迭代器模式>,作者:元闰子. 简介 有时会遇到这 ...

  10. php适配器设计模式

    <?php //适配器模式 //服务器端代码 class tianqi{ public static function show(){ $today= array('tep' =>28 , ...

随机推荐

  1. SQLServer当数据导入平面文件

    SQLServer当数据导入无发正常工作时候,可以尝试BULK命令操作 BULK INSERT [dbo].[test] FROM 'H:\testdb.csv' WITH( FIELDTERMINA ...

  2. ffmpeg 将jpg转为yuv

    ffmpeg -i temp.jpg -s 1024x680 -pix_fmt yuvj420p 9.yuv   此前网上有条盛传的命令 -y -s出来uv是错的

  3. TiKV 源码解析系列 - Raft 的优化

    本系列文章主要面向 TiKV 社区开发者,重点介绍 TiKV 的系统架构,源码结构,流程解析.目的是使得开发者阅读之后,能对 TiKV 项目有一个初步了解,更好的参与进入 TiKV 的开发中.本文是本 ...

  4. r table

    一.table 函数对应的就是统计学中的列联表,是一种记录频数的方法,对于统计来说有非常重要的应用,下面的例子都是针对维数为2的情况举例,多维的情况是类似的 下面看一个例子: > ct < ...

  5. 浅谈跨域以WebService对跨域的支持

    跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源. 在 ...

  6. C++ 结构体初始化

    #include <stdio.h> int main(int argc, const char * argv[]) { //定义结构体类型 struct Person { char *n ...

  7. python-切片实例

    针对list或tuple取指定范围的操作.可以使用切片(slice),非常有用 1.list:可变数组 L=['a','b','c','d','e'] >>> L[0:3] #从第0 ...

  8. Spring Data Commons 官方文档学习

    Spring Data Commons 官方文档学习   -by LarryZeal Version 1.12.6.Release, 2017-07-27 为知笔记版本在这里,带格式. Table o ...

  9. vi 打开文件,行末尾有^M

    原因: Windows下的文本文件的每一行结尾,都有一个回车符('\n')和一个换行符('\r') Linux下的文本文件的每一行结尾,只有一个回车符('\n') Mac下的文本文件的每一行结尾,只有 ...

  10. R语言curve绘图函数

    curve 函数常用于绘制函数对应的曲线,确定函数的表达式,以及对应的需要展示的起始坐标和终止坐标,curve函数就会自动化的绘制在该区间内的函数图像 基本用法,代码示例: curve(sin, -2 ...