博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结构型模式之Adapter模式
阅读量:6297 次
发布时间:2019-06-22

本文共 1918 字,大约阅读时间需要 6 分钟。

适配器模式把一个类的接口变换成客户端所期待的另一种接口。

在JDK中的体现

把一个接口或类变成另外一种。

java.util.Arrays#asList()

javax.swing.JTable(TableModel)
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

参与角色

目标角色(Target): 定义Client使用的与特定领域相关的接口,即期待得到的接口。

客户角色(Client):与符合Target接口的对象协同。
被适配橘色(Adaptee):定义一个已经存在并已经使用的接口,这个接口需要被适配。
适配器角色(Adapte):适配器模式的核心。
它将对被适配Adaptee角色已有的接口转换为目标角色Target匹配的接口,对Adaptee的接口与Target接口进行适配.

适配器模式实例

 

1
2
3
4
5
6
7
8
/**
 
* 所期待得到的接口
 
*/
public 
interface 
Target {
 
    
/**类似中国的电源接口*/
    
public 
void 
expectMethod();
}

  

1
2
3
4
5
6
7
8
9
10
/**
 
* 需要被适配的接口,类似国外的电源接口
 
*/
public 
class 
Adaptee {
 
    
/**德国电源插口*/
    
public 
void 
notMatchMethod(){
        
System.out.println(
"这是待适配的德国电源插口__"
);
    
}
}

  

1.类适配器模式

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 
* 类适配器模式
 
* 适配器角色Adapter扩展了Adaptee,同时又实现了目标(Target)接口。
 
*/
public 
class 
Adapter1 
extends 
Adaptee 
implements 
Target{
 
    
@Override
    
public 
void 
expectMethod() {
        
//可以调用Adaptee的方法做适当修改
        
notMatchMethod();
        
System.out.println(
"在适配器中实现期待的方法"
);
    
}
}

  

Adapter与Adaptee是继承关系

用一个具体的Adapter类和Target进行匹配。结果是当我们想要一个匹配一个类以及所有它的子类时,类Adapter将不能胜任工作
使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子集
仅仅引入一个对象,并不需要额外的指针以间接取得adaptee

 

2.对象适配器模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 
* 对象适配器模式
 
* 通过对象的委托实现
 
*/
public 
class 
Adapter2 {
     
    
private 
Adaptee adaptee;
     
    
public 
Adapter2(Adaptee adaptee){
        
this
.adaptee=adaptee;
    
}
     
    
public 
void 
notMatchMethod(){
        
//
        
this
.adaptee.notMatchMethod();
    
}
     
    
public 
void 
expectMethod(){
        
//需要的接口
        
System.out.println(
"在适配器中实现期待的方法"
);
    
}
 
}

  

Adapter与Adaptee是委托关系

允许一个Adapter与多个Adaptee同时工作。Adapter也可以一次给所有的Adaptee添加功能
使用重定义Adaptee的行为比较困难
无论哪种适配器,宗旨都是:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
即在不改变原有系统的基础上,提供新的接口服务。

适用场景

使用一个已经存在的类,而它的接口不符合你的需求,

创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

 

本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/4304679.html,如需转载请自行联系原作者

你可能感兴趣的文章
Docker之功能汇总
查看>>
!!a标签和button按钮只允许点击一次,防止重复提交
查看>>
(轉貼) Eclipse + CDT + MinGW 安裝方法 (C/C++) (gcc) (g++) (OS) (Windows)
查看>>
还原数据库
查看>>
作业调度框架 Quartz.NET 2.0 beta 发布
查看>>
mysql性能的检查和调优方法
查看>>
项目管理中的导向性
查看>>
Android WebView 学习
查看>>
(转)从给定的文本中,查找其中最长的重复子字符串的问题
查看>>
HDU 2159
查看>>
spring batch中用到的表
查看>>
资源文件夹res/raw和assets的使用
查看>>
UINode扩展
查看>>
LINUX常用命令
查看>>
百度云盘demo
查看>>
概率论与数理统计习题
查看>>
初学structs2,简单配置
查看>>
Laravel5.0学习--01 入门
查看>>
时间戳解读
查看>>
sbin/hadoop-daemon.sh: line 165: /tmp/hadoop-hxsyl-journalnode.pid: Permission denied
查看>>