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

【Java 设计模式】接口型模式--Adapter(适配器)模式

2017-11-14 09:11 771 查看


【Java 设计模式】接口型模式–Adapter(适配器)模式

Adapter模式的宗旨就是:向客户提供接口,并使用现有的类所提供的服务,以满足客户的需求。 

或者说,现在有class A的方法满足客户的部分要求,将另一部分需求抽象为interface B,那么就要有Adapter来使得class A和interface B相互结合,满足客户全部需求。

通俗的理解:在party上,我想去搭讪一个女生Jerry。但是我的英语很烂,于是我拿了个翻译器,翻译器就是我和Jerry之间的Adapter,让我和Jerry可以很好的交谈。

一,类适配器 



示例代码
public interface RequiredInterface {
/**
* 这是客户需要的方法
*/
public void requireMethod();
}
1
2
3
4
5
6
public class ExistingClass {
/**
* 这是现有的方法
*/
public void usefulMethod(){}

}
1
2
3
4
5
6
7

 适配器角色Adapter扩展了ExistingClass ,同时又实现了RequiredInterface 接口。由于ExistingClass 没有提供requireMethod()方法,而RequiredInterface 又要求这个方法,因此适配器角色Adapter实现了这个方法。
public class Adapter extends ExistingClass implements RequiredInterface {
/**
* 由于源类ExistingClass没有方法requireMethod()
* 因此适配器补充上这个方法
*/
@Override
public void requireMethod() {
//写相关的代码
}
}
1
2
3
4
5
6
7
8
9
10

二,对象适配器 

类适配器通过创建子类来实现适配,在设计类适配器的时候,新的适配器类可以实现期望的接口,并扩展已有的类。而对象适配器则是用委托的方式。 

有两种方式,一种是实现接口的方式,一种是继承类的方式。 

实现目标接口 


 

示例代码
public interface RequiredInterface {
/**
* 这是客户需要的方法
*/
public void requireMethod();
}
1
2
3
4
5
6
public class ExistingClass {
/**
* 这是现有的方法
*/
public void usefulMethod(){}

}
1
2
3
4
5
6
7
public class Adapter implements RequiredInterface{
private ExistingClass exist;

public Adapter(ExistingClass exist){
this.exist = exist;
}
/**
* 源类ExistingClass有方法usefulMethod
* 因此适配器类直接委派即可
*/
public void usefulMethod(){
this.exist.usefulMethod();
}
/**
* 由于源类ExistingClass没有方法requireMethod()
* 因此适配器补充上这个方法
*/
@Override
public void requireMethod() {
//写相关的代码
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

继承目标类 


 

示例代码
public class RequiredClass {
/**
* 这是客户需要的方法
*/
public void requireMethod();
}
1
2
3
4
5
6
public class ExistingClass {
/**
* 这是现有的方法
*/
public void usefulMethod(){}

}
1
2
3
4
5
6
7
public class Adapter extends RequiredClass {
private ExistingClass exist;

public Adapter(ExistingClass exist){
this.exist = exist;
}
/**
* 源类ExistingClass有方法usefulMethod
* 因此适配器类直接委派即可
*/
public void usefulMethod(){
this.exist.usefulMethod();
}
/**
* 由于源类ExistingClass没有方法requireMethod()
* 因此适配器补充上这个方法
*/
public void requireMethod() {
//写相关的代码
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

三,接口的适配器模式 

接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些, 

此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。 



示例代码
public interface RequiredInterface{

public void requireMethod1();
public void requireMethod2();
}
1
2
3
4
5
public abstract class AbstractRequiredClass implements RequiredInterface{

public void requireMethod1(){}
public void requireMethod2(){}
}
1
2
3
4
5
public class Adapter1 extends AbstractRequiredClass {
public void requireMethod1(){
System.out.println("the RequiredInterface interface's first requireMethod1!");
}
}
1
2
3
4
5
public class Adapter2 extends AbstractRequiredClass {
public void requireMethod2(){
System.out.println("the RequiredInterface interface's first requireMethod2!");
}
}
1
2
3
4
5

个人觉得适配器模式中的这三种模式是挺灵活的,比如:复用性,系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。还有扩展性在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。 

不过在使用适配器时,也要注意到除非对系统的架构很清楚,否则过多的使用适配器,会让系统非常零乱,不易整体进行把握。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: