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. python django查询12306火车票

    逢年过节,想坐个高铁票,都得上12306去买票,但用过的都会发现,它会把临近站点的也筛出来了.但有时我们压根就不会考虑买到临近站点的. 另一方面,在购票高峰期,有可能你要的出发站到目的站都没有票了,这 ...

  2. 【linux】——FTP出现500 OOPS: cannot change directory的解决方法

    cannot change directory:/home/*** ftp服务器连接失败,错误提示: 500 OOPS: cannot change directory:/home/******* 5 ...

  3. APICloud 实践 —— 手机端预览项目

    上一次讲到如何创建一个应用,今天讲下如何在手机端预览项目. 1.下载 AppLoader 下载地址:https://docs.apicloud.com/Download/download#apploa ...

  4. 【转】web前端到底怎么学?干货资料!

    一般据我经验,在喜欢并且决定和她恋爱之前,我都会做一下充分准备和调查,有必要了解和研究清楚 ‘她’ 的几个特性和习惯 web前端的基本工作职责 和基础技能(要清楚) web前端的分类和门派(简要概述, ...

  5. Linux 内核版本,Ubuntu版本的查看

    查看内核版本 1)  cat /proc/version [root@a ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@x ...

  6. GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。

    Opengl红皮书有选择的看了一些,最后的讲着色语言GLSL的部分看的甚为不理解,然后找到Opengl橙皮书,然后就容易理解多了. 在前面,我们或多或少接触到Opengl的处理过程,只说前面一些处理, ...

  7. JAVA对于程序的运行的一种解说

    main方法,正如注释所说,这是程序开始执行的第一行.对于一个Java应用程序来说,main方法是必需的,Java解释器在没有生成任何对象的情况下,以main作为入口来执行程序.每个类中可以定义多个方 ...

  8. nodejs基础 -- 多进程

    Node.js 多进程 我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能. 每个子进程总是带有三个 ...

  9. Java入门与基础算法班 - 课程大纲

    第1章 零基础转CS,如何准备? · 转专业找CS工作怎么办? · 零基础如何在最短时间内拿到offer? · 如何写好简历? · IT技术面试内容有哪些? · JAVA语言怎么入门? 第2章 数组与 ...

  10. .NET WebAPI 正确抛出错误详细信息

    try { ... } catch (Exception e) { //在webapi中要想抛出异常必须这样抛出,否则之抛出一个默认500的异常 var resp = new HttpResponse ...