引入:
在现实生活中我们往往会遇到各种不兼容的情况,比如生活用电220V而笔记电脑20V,插座是两个孔的但要充电的电脑插头是三个孔的,这时候我们就会引入一些转换器(适配器), AC Adapter(交流电适配器)和转换插板。
还有如果我们要组装一台电脑,需要主板、硬盘等,这些组件我们只需去买就行了,而不用重新开发。也就是说,在开发系统中也一样,可以采用已有的组件(第三方已开发的软件)基础上再开发,那如何更好的应用第三方软件呢?适配器模式就闪亮登场了。
适配器模式:
适配器模式分为对象适配器和类适配器。
例如现在要开发一个加法功能,定义目标接口
/*
* 目标抽象类:定义客户希望调用的方法形式
*/
public interface IMath {
int add(int a,int b);//求两数之和
}
但发现有第三方(适配者)已经实现了这个加法功能
/*
* 适配者类:实现功能的第三方软件类
*/
public class ThirdCompany {
public int addCalc(int a, int b) {
return a + b;
}
}
那我们就定义个适配器类调用就好了。
/*
* 对象适配器类
*/
public class MyMaht implements IMath{
ThirdCompany third;
public MyMaht(ThirdCompany third) {
this.third = third;
}
@Override
public int add(int a, int b) {
return third.addCalc(a, b);
}
}
/*
* 类适配器类
*/
public class MyMath2 extends ThirdCompany implements IMath {
@Override
public int add(int a, int b) {
return addCalc(a, b);
}
}
public class Test {
public static void main(String[] args) {
ThirdCompany third = new ThirdCompany(); //定义第三方对象
MyMaht obj = new MyMaht(third); //传入适配对象
int v = obj.add(1, 2);
System.out.println(v);
}
}
默认适配器
我们直接实现一个接口的话,需要在子类中实现接口中的所有方法。但有时候我们可能只会用到接口中的一两个方法,没有必要重写接口中定义的所有方法,这时候也就需要用到默认适配器类。 思想:其实就是在接口和具体子类之间增加一个默认的抽象类,在抽象类中写每一个接口方法的默认实现。当需要写具体类时去继承该抽象类,这样只要实现需要的重写方法就行了,而不用重写接口中的所有方法。
当我们在JFrame中加一个MouseListener窗口监听时,MouseListener接口中定义了几个方法,但我们可能只需要用到其中一个mouseClicked()的方法,这时候我们就可以用一个MouseListener的默认实现类:MouseAdapter类(一个抽象类)。
public class Test {
public static void main(String[] args) {
JFrame jf = new JFrame("Window");
// jf.addWindowListener(new WindowAdapter() {
// public void windowClosing(WindowEvent e) {
// System.exit(0);
// }
// });
// jf.addMouseListener(new MouseListener(
// ) {
//
// @Override
// public void mouseReleased(MouseEvent e) {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// public void mousePressed(MouseEvent e) {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// public void mouseExited(MouseEvent e) {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// public void mouseEntered(MouseEvent e) {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// public void mouseClicked(MouseEvent e) {
// System.out.println("鼠标被点击拉");
//
// }
// });
jf.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标被点击拉");
}
});
jf.setSize(200, 200);
jf.setVisible(true);
}
}