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. RavenDb学习(一)设计模式介绍

    RavenDb是一个文档型的数据库,和芒果Db是一个类型的东西,但是公司选择了它,主要是因为它对事务的支持比较好,芒果Db在事务方面有问题. 下面有一个例子. 在关系型数据库中,我们要展示以上的内容, ...

  2. android开发(37) android使用android_serialport_api 操作串口,解决权限问题

    最近有个项目,要使用android设备操作串口的 斑马GK888T打印机,使用打印机打印二维码. 硬件设备连接方式: 安卓设备 通过 串口RS232 连接 斑马打印机的串口 那么就要解决:使用安卓设备 ...

  3. mysql 限制sql执行时间

    mysql 5.7.8开始 max_execution_time applies to read-only SELECT statements. mysql> show variables li ...

  4. windows10删除开始菜单中的xbox、人脉、邮件等应用

    1.右键单击PowerShell,选择“以管理员身份运行” 2.输入下面的命令回车,会列出系统中所有已安装应用列表. Get-AppxPackage -AllUsers 从列表中找到你要卸载的应用,并 ...

  5. Struts2、Spring、Hibernate 高效开发的最佳实践(转载)

    Struts2.Spring.Hibernate 高效开发的最佳实践 Struts2.Spring.Hibernate(SSH)是最常用的 Java EE Web 组件层的开发技术搭配,网络中和许多 ...

  6. Encapsulating Data 数据封装

    Objective-C中类的封装本质上其他OO语言没什么区别,不过在概念和书写表达上差异还是比较大的, Property属性 这里的Property并不是简单的类成员变量,而是OC中特有的可以为编译器 ...

  7. 关于Unity中FPS第一人称射击类游戏制作(专题十)

    当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 场景搭建 1: 导入人物模型, 手持一把枪;2: 导入碎片模型;3: 创建一个平面;4: 创建一个障碍物;5: 导入人物模型;6: 配置 ...

  8. 一个完整的SAP RFC调用接口封装

    因为经常需要访问sap操作数据,就封装了一个类方便调用,运行条件需要安装sap客户端,在sap客户端安装之后会带有一个com接口,本接口就通过这个com访问sap,因为com的后期绑定问题故使用了vb ...

  9. Eclipse初次java开发问题总结-4-Maven使用问题汇总

    Non-resolvable parent POM [INFO] Scanning for projects... [ERROR] The build could not read 1 project ...

  10. Numpy存字符串

    # -*- coding: utf-8 -*- import numpy as np student = np.dtype({'names':['name', 'age', 'weight'], 'f ...