文档章节

设计模式(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 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
javascript 设计模式之工厂(Factory)模式

工厂模式介绍 工厂模式是一个创建型的模式,主要就是创建对象。其中工厂模式又分为简单工厂模式和抽象工厂模式。简单工厂模式是通过工厂方法确定创建 对应类型的对象。抽象工厂模式是通过子类...

hlxiong
2014/04/14
0
0
JavaScript常用设计模式

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

a独家记忆
07/13
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

职场老人谈:Linux学习分享

随着Linux系统慢慢渗透到生活的方方面面,对Linux的基本操作就越来越必要了。 我是一位软件测试工程师,初次接触Linux主要是因为需要配置Linux服务器。因为Linux系统是一套开源的操作系统,安...

linux-tao
14分钟前
1
0
Oracle chr() ascii()

函数简介 实用函数 chr() 和 ascii() chr() 函数将ASCII码转换为字符: ASCII码 –> 字符; ascii() 函数将字符转换为ASCII码: 字符 –> ASCII码; 在 Oracle 中 chr() 函数和 ascii() 是一对...

taadis
16分钟前
0
0
职场老人谈:Linux学习分享

随着Linux系统慢慢渗透到生活的方方面面,对Linux的基本操作就越来越必要了。 我是一位软件测试工程师,初次接触Linux主要是因为需要配置Linux服务器。因为Linux系统是一套开源的操作系统,安...

linuxprobe16
25分钟前
0
0
Confluence 6 Windows 中以服务方式自动重启的原因

针对长时间使用的 Confluence,我们推荐你配置 Confluence 自动随操作系统重启而启动。针对一些 Windows 的服务器,这意味着需要让 Confluence 以服务的方式运行。 有下面 2 种方式来以服务的...

honeymose
今天
3
0
day93-20180920-英语流利阅读-待学习

时尚之觞:外表光鲜靓丽,其实穷得要命 Lala 2018-09-20 1.今日导读 讲到时尚界,我们脑海里浮现的可能都是模特和设计师光鲜靓丽、从容潇洒的模样。可是,最近在法国出版的一本书却颠覆了我们...

飞鱼说编程
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部