文档章节

设计模式(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
广州
私信 提问
设计模式 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
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
《PHP设计模式大全》系列分享专栏

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

kaixin_code
2018/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式之延时任务方案解析

方案分析 (1)数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作 实现 博主当年早期是用...

微笑向暖wx
27分钟前
1
0
博客目录

1.剑指offer目录 剑指offer目录 2.开放的面试题 开放面试题目录

细节探索者
28分钟前
1
0
自定义线程池

自定义线程工厂: public class CustomThreadFactory implements ThreadFactory { private static final Logger LOGGER = LoggerFactory.getLogger(CustomThreadFactory.class); pu......

hensemlee
58分钟前
2
0
记一次oom内核优化记录:vm.lower_zone_protection

情景 最近gitlab服务会偶发性500,当前机器部署了gitlab、nfs等服务,经过排查发现是nfsd引发oom,导致系统运行不畅。处理过程如下: 事故现场 开发在使用gitlab的时候发现,偶发性的出现500...

阿dai
今天
6
0
Spring Batch JSON 支持

Spring Batch 4.1 开始能够支持 JSON 格式了。这个发布介绍了一个新的数据读(item reader)能够读取一个 JSON 资源,这个资源按照下面的格式: [  {    "isin": "123",    ...

honeymose
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部