您的位置:首页 > 编程语言 > Java开发

java设计模式第1弹---适配器模式

2015-09-06 17:47 218 查看
其实作为很多技术来讲,写出来的博客,专业术语很强,也许是程序员的通性吧,这样子显得比较NB点,其实这样子很多入门级的程序员看到后,感觉的确会很NB,但是往往他们也看不懂你到底写了什么东东。这就给入门级的程序员了带来了很多苦恼,想学点高档上的技术,却无奈看不懂人家博客到底写的神马东西,这里呢,我会将自己理解的东西,用通俗易懂的生活实例表达出来。好了,开始吧!

程序员大多比较喜欢漂亮妹子(这不废话吗,是个正常男人基本都喜欢漂亮妹子,

)我们就拿妹子来举例子吧

一、适配器模式慨念

(术语描述)将一个接口转换成客户希望的另外一个接口

(通俗描述)过年你回家相亲,来到相亲的地方,妹子来了,你一看,这不就是我想要的妹子吗?(于是你激动的口吐白袜)但是妹子一张嘴说的是韩文,你傻眼了,这可咋办,辛亏你二大爷在你旁边,这厮会韩文,然后他就作为你和妹子之间的Adapter,让你们可以交谈了(哇哇,你二大爷好腻害,会韩文呢,嘻嘻)

二、解决的问题

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


先看下图,可能会更直观




三、模式中的角色

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

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

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

3.4 客户(Client):使用目标接口,与和目标接口一致的接口合作。
四、实现适配器模式的两种方法
3.1类的适配器模式(采用继承实现)

<pre name="code" class="java">package com.sjms;

public class AdapterModel {
// 测试类 Client
public static void main(String[] args) {
Client client = new Client();
client.say();
}
}
/**
*  已存在的、具有特殊功能、但不符合我们既有的标准接口的类
*  通俗:需要被适配的妹子
* @author 素剑步青尘
*
*/
class Adaptee {
public void A() {
System.out.println("我就是会说韩文的妹子,但是对面那个逗比不懂韩文,看着还挺不错的,怎么办呢?好愁人");
}
}
/**
* 目标接口
* 通俗:要会说韩文
* @author 素剑步青尘
*
*/
interface Target {
public void request();
}

/**
*  适配器类,继承了被适配类,实现了目标接口(其实我就是继承了适配器,然后实现了接口,重写接口的时候我调用被适配类的方法,嘻嘻,我说不是很聪明呢?)
*  通俗来讲这个类就相当于你二大爷啊(哇哇,好腻害的二大爷啊)
* @author 素剑步青尘
*
*/
class Adapter extends Adaptee implements Target {

public void request() {
A();
}
}
/**
 * 客户类(我调用二大爷就可以达到我目的了,嘿嘿)
 * @author 素剑步青尘
 *
 */
class Client{
<span style="white-space:pre">	</span>public void say(){
<span style="white-space:pre">		</span>Target adapter = new Adapter(new Adaptee());
<span style="white-space:pre">		</span>adapter.request();
<span style="white-space:pre">	</span>}
}


上面这种实现的适配器称为类适配器,因为 Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口(因为 Java 不支持多继承,所以这样来实现),在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。另外一种适配器模式是对象适配器,它不是使用多继承或继承再实现的方式,而是使用直接关联,或者称为委托的方式

3.2对象适配器(采用对象组合方式实现),其他都一样,修改一下适配器内部

/**
*  适配器类,继承了被适配类,实现了目标接口(其实我就是继承了适配器,然后实现了接口,重写接口的时候我调用被适配类的方法,嘻嘻,我说不是很聪明呢?)
*  通俗来讲这个类就相当于你二大爷啊(哇哇,好腻害的二大爷啊)
* @author 素剑步青尘
*
*/
class Adapter extends Adaptee implements Target {

// 直接关联被适配类
private Adaptee adaptee;

// 可以通过构造函数传入具体需要适配的被适配类对象
public Adapter (Adaptee adaptee) {
this.adaptee = adaptee;
}

public void request() {
// 这里是使用委托的方式完成特殊功能
this.adaptee.A();
}

}
测试结果与上面的一致。从类图中我们也知道需要修改的只不过就是 Adapter 类的内部结构,即 Adapter 自身必须先拥有一个被适配类的对象,再把具体的特殊功能委托给这个对象来实现。使用对象适配器模式,可以使得
Adapter 类(适配类)根据传入的 Adaptee 对象达到适配多个不同被适配类的功能,当然,此时我们可以为多个被适配类提取出一个接口或抽象类。这样看起来的话,似乎对象适配器模式更加灵活一点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: