适配器模式
1.适配器模式的定义:
将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
2.适配器模式的结构和说明:
Client: 客户端,调用自己需要的领域接口Target。
Target: 定义客户端需要的跟特定领域相关的接口。
Adaptee: 已经存在的接口,通常能满足客户端的功能要求,但是接口与客户端要求的特定领域的接口不一致,需要被适配。
Adapter: 适配器,把Adaptee适配成为Client需要的接口。
3.模式实现
Adaptee.java
Adapter.java
Client.java
4.思考适配器模式
A,适配器模式的本质:转换匹配,复用功能
适配器模式的主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。也就是说,客户端需要的功能应该是已经实现好了的,不需要适配模式来实现,适配器模式主要负责把不兼容的接口转换成客户期望的样子就可以了。
B,何时选用适配器模式,建议在以下情况中选用:
1): 如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口。
2): 如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么就适配什么。
3): 如果你想使用一些已经存在的子类,但是不可能对每个子类都进行适配,这种情况可以选用对象适配器,直接适配这些子类的父类就可以啦。
将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
2.适配器模式的结构和说明:
Client: 客户端,调用自己需要的领域接口Target。
Target: 定义客户端需要的跟特定领域相关的接口。
Adaptee: 已经存在的接口,通常能满足客户端的功能要求,但是接口与客户端要求的特定领域的接口不一致,需要被适配。
Adapter: 适配器,把Adaptee适配成为Client需要的接口。
3.模式实现
Target.java
package com.java.pattern.adapter;
/**
* 定义客户端使用的接口,与特定领域相关
*
*/
public interface Target {
// 客户端请求处理的方法
public void request();
}
Adaptee.java
package com.java.pattern.adapter;
/**
* 已经存在的接口,这个接口需要被适配
*
*/
public class Adaptee {
// 原本已经存在,已经实现的方法
public void specificRequest() {
// 具体的功能处理
}
}
Adapter.java
package com.java.pattern.adapter;
/**
* 适配器
*/
public class Adapter implements Target {
// 持有需要被适配的接口对象
private Adaptee adaptee;
/**
* 构造方法,传入需要被适配的接口对象
*
* @param adaptee 需要被适配的对象
*/
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
// 可能转调已经实现了的方法,进行适配
adaptee.specificRequest();
}
}
Client.java
package com.java.pattern.adapter;
/**
* 使用适配器的客户端
*
*/
public class Client {
public static void main(String[] args) {
// 创建需要被适配的对象
Adaptee adaptee = new Adaptee();
// 创建客户端需要调用的接口对象
Adapter target = new Adapter(adaptee);
// 请求处理
target.request();
}
}
4.思考适配器模式
A,适配器模式的本质:转换匹配,复用功能
适配器模式的主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。也就是说,客户端需要的功能应该是已经实现好了的,不需要适配模式来实现,适配器模式主要负责把不兼容的接口转换成客户期望的样子就可以了。
B,何时选用适配器模式,建议在以下情况中选用:
1): 如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口。
2): 如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么就适配什么。
3): 如果你想使用一些已经存在的子类,但是不可能对每个子类都进行适配,这种情况可以选用对象适配器,直接适配这些子类的父类就可以啦。