* 适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式使得
* 原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
* 模式中的角色:
* 1.目标接口(target):客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。
* 2.需要适配的类(adaptee):需要适配的类或适配者类。
* 3.适配器(adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
生活中有很多例子就是适配器原理,我们就以笔记本和键盘为例来写:
* 例子:笔记本想直接使用键盘,但用不了,笔记本只有USB接口,而键盘是PS/2接口,这时
* 可以用转换器来实现,适配器也是这原理。
* target可以看做是USB接口,PS/2键盘就是adaptee,还有适配器adapter,
* 调用者Client笔记本只识别USB接口,然后适配器即实现了USB接口,又持有adaptee,
* 适配器实现了USB接口和adaptee之间的联系,这样笔记本只需要通过USB就可以使用键盘了。
搞清楚之间的关系了,我们来看下具体代码,首先写键盘,也就是被适配的对象:
/**
* 被适配的对象:PS/2键盘
*/
public class Adaptee {
public void request(){
System.out.println("可以实现客户请求的需要的功能!");
}
}
然后是USB接口:
/**
*USB接口
*/
public interface Target {
void handleReq();
}
然后是笔记本,笔记本想通过USB接口来使用键盘:
public class Client {
public void test1(Target t){
t.handleReq();
}
}
适配器,也可以说是转换器,有两种方式:
**
* 适配器:USB和PS/2的转接器
* 两种方式:
* 1.类适配器方式:继承Adaptee,弊端是类只能单继承,不够灵活。
* 2.对象适配器:使用了组合的方式跟被适配对象整合。
*/
//方式一
//public class Adapter extends Adaptee implements Target{
//
//
// @Override
// public void handleReq() {
// super.request();
// }
//}
//方式二
public class Adapter implements Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void handleReq() {
adaptee.request();
}
}
这时候笔记本可以通过USB接口来使用键盘了:
public class Client {
public void test1(Target t){
t.handleReq();
}
public static void main(String[] args) {
//方式一
// Client c = new Client();
// Target t = new Adapter();
// c.test1(t);
//方式二
Client c = new Client();
Target t = new Adapter(new Adaptee());
c.test1(t);
}
}