文档章节

设计模式(6)---->适配器模式

小强斋太
 小强斋太
发布于 2016/11/09 20:06
字数 1094
阅读 1
收藏 0

一. 概述

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

二. 解决的问题

  即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

三. 模式中的角色

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

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

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

代码结构

Target

public interface Target {  
    void adapterMethod();
}

Adaptee

public class Adaptee {
 
    public void adapteeMethod() {
        Syste.out.ptintln("Adaptee method!");
    }
}

Adapter

对象适配器:

public class Adapter implements Target {
 
//引入被适配者
private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
 
        public void adapterMethod() {
               System.out.println("Adapter method!");
    }
}

类适配器:

Public class Adapter extends Adapteee implements Target {
        public void adapterMethod() {
               System.out.println("Adapter method!");
    }
}

Client

public class Test {
 
    public static void main(String[] args) {
        Target target = new Adapter(new Adaptee());        
        target.adapterMethod();
    }
}

result

Adapter method!

四、例子

PS2接口

/**
 * PS2接口,圆口
 */
public interface PS2Port {
	public void workWithPS2();
}

usb接口

/**
 * USB接口,U口
 */
public interface USBPort {
	public void workWithUSB();
}

PS2ToUSB转换器

/**
 * 对象适配器
 * 将PS2接口装换成USB接口
 * 所以此类类型是USB接口(implements USBPort) + 成员变量ps2Port
 */
public class PS2ToUSB implements USBPort {

	private PS2Port ps2Port;

	public PS2ToUSB(PS2Port ps2Port) {
		this.ps2Port = ps2Port;
	}

	@Override
	public void workWithUSB() {
		System.out.println("转换的关键在这里,本来是");
		ps2Port.workWithPS2();
		System.out.println("经过你的转换,现在是USB工作中");
	}

}

场景类

public class Client {

	public static void main(String[] args) {
		//1.我现在有一个PS2接口
		PS2Port ps2Port = new WorkPiece();
		//2.但是我需要的是一个USB接口啊,对我(client)来说,我只认识USB接口
		//3.经过PS2ToUSB的转换,PS2接口变成了USB接口
		USBPort ps2ToUsbPort = new PS2ToUSB(ps2Port);
		ps2ToUsbPort.workWithUSB();

	}

}

其中的WorkPiece 只是一个PS2接口的一个子类

public class WorkPiece implements PS2Port {

		public void workWithPS2() {
			System.out.println("PS2工作中");
		}

	}

五. 模式总结

5.1 优点

  1. 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
  2. 复用了现存的类,解决了现存类和复用环境要求不一致的问题。
  3. 将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
  4. 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

5.2 缺点

    对于对象适配器来说,更换适配器的实现过程比较复杂。

5.3 适用场景

  1. 系统需要使用现有的类,而这些类的接口不符合系统的接口。
  2. 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  3. 两个类所做的事情相同或相似,但是具有不同接口的时候。
  4. 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
  5. 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

5.4 “对象”适配器和“类”适配器。

1)对象适配器:使用对象组合,以修改的接口包装被适配者,被适配者的任何子类都可以搭配着适配器使用。

2)类适配器:使用继承,不需要重新实现整个被适配者。

6. 适配器应用举例

手机电源适配器

 

在java 中有一种叫做“缺省适配模式”的应用,它和我们所讲的适配器模式是完全的两种东西。缺省适配模式是为一个接口提供缺省的实现,这样子类型就可以从缺省适配模式中进行扩展,避免了从原有接口中扩展时要实现一些自己不关心的接口。在java.awt.event 中的XXXAdapter 就是它的很好的例子

 

本文转载自:http://www.cnblogs.com/xqzt/archive/2013/05/31/5637062.html

共有 人打赏支持
小强斋太
粉丝 0
博文 181
码字总数 0
作品 0
广州
私信 提问
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
11/06
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
0
0
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js前端图片处理例子

首先需要了解几个api FileReader FileReader主要用于将文件内容读入内存,通过一系列异步接口,可以在主线程中访问本地文件。 <table> <tr> <th>方法定义</th> <th>描述</th> </tr> <tr> <t......

别人说我名字很长
17分钟前
1
0
前端常用插件、工具类库汇总(下)

前言 对本文感兴趣可以先加个收藏,也可以转发分享给身边的小伙伴,以后遇到类似的场景就来看看具体的插件及其用法。 上一篇《前端常用插件、工具类库汇总(上)》内容摘要: 动画库 滚动库 ...

我的卡
23分钟前
3
0
jq 的 $ 符号冲突解决办法

百度了一下,都是 感觉挺负责的,我只是想当前页面 简单使用jq ,解决冲突即可。 很简单的 将 $ 符号换成 jQuery 即可,就不怕冲突了。 jQuery('#message').val();...

之渊
25分钟前
1
0
如何在Cordova Android 7.0.0 以下版本集成最新插件 极光插件为例

前提 Cordova Android 7.0.0开始改变了项目安卓平台的架构。新建一个空项目分别添加Android 6.4.0 和 Android 7.0.0平台: cordova platform add android@6.4.0cordova platform add androi...

极光推送
33分钟前
1
0
移动端Appium自动化测试框架的优势

众所周知,现在市面上的移动端操作系统已被Android和IOS占领,其中Android的份额更是在80%以上。那么面对市面上林林总总的自动化测试框架和工具,为什么说Appium在自动化测试框架的统治级优势...

程序猿拿Q
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部