适配器模式(Adapter)就是把一个类的接口转换成客户端所期待的另一种接口。从而使原本两个因为不匹配的类无法在一起工作变成能在一起工作。举个栗子来说,现在的家用电器一般都要求使用220v的电压工作,遇到个别要求使用110v电压的电器时,我们就需要一个变压器,这个变压器就可以理解成为这里的适配器。
那么,哪些场景下我们需要使用适配器模式呢?
1、系统使用类的接口不符合系统要求。
2、要建立一个重复使用的类,用于与该类关联不大的类,包括工作中引进的类。
3、类的适配器模式有点像类的多继承模式,利用接口的特性,把一些零散的类组织在一起,成为一个新的类来实现调用,并且看起来像是对一个类的操作。实际上,适配器模式更强调的是对类的组织,而不是功能的实现。
适配器模式的作用:
适配器模式可以方便的组织代码组织与模型的准确表示,可以把一个类的成员插到另一个类的子类中去,从而让这个继承的子类看起来像一个新类,同时可以对父类减少依赖,下面来看个简单的例子,看看适配器模式是怎么把220V电压转换成110V电压的。
一、类适配器模式
原理:通过继承来实现适配器功能。
1.定义一个输出110V电压的接口
/**
* 输出110V电压
*
*/
public interface IV110 {
void isV110();
}
2.实现110V电压输出
public class V110Impl implements IV110{
public void isV110(){
System.out.println("我输出110V电压。");
}
}
3.定义一个220V电压输出接口
/**
* 输出220V电压
* @author Administrator
*
*/
public interface IV220 {
void isV220();
}
4.定义一个适配器,用来做变压器功能。
/**
* 我是变压器,将220V电压变换成110V电压
*
*/
public class VAdapter extends V110Impl implements IV220{
public void isV220(){
isV110();
}
}
5.测试我们的变压器
public class TestAdapter {
public static void main(String[] args){
VAdapter adapter = new VAdapter();
adapter.isV220();
}
}
6.测试结果:
我输出110V电压。
通过变压器转换后,已经将电压从220v转换成了110V。这个就是类适配器模式了。
二、对象适配器模式
原理:通过组合来实现适配器模式
当我们想访问的接口A没有我们想要的方法,在另外一个接口B中却有我们需要的方法,在这种场景下,我们可以通过组合的方式来建立一个适配器。
1.定义一个输出110V电压的接口
/**
* 输出110V电压
*
*/
public interface IV110 {
void isV110();
}
2.定义一个220V电压输出接口
/**
* 输出220V电压
* @author Administrator
*
*/
public interface IV220 {
void isV220();
}
3.实现110V电压输出
public class V110Impl implements IV110{
public void isV110(){
System.out.println("我输出110V电压。");
}
}
4.定义适配器
public class VAdapter implements IV220{
private IV110 v110;
public VAdapter(IV110 v110){
this.v110 = v110;
}
public void isV220(){
v110.isV110();
}
}
5.定义测试类
public class TestAdapter {
public static void main(String[] args){
VAdapter adapter = new VAdapter(new V110Impl());
adapter.isV220();
}
}
6.测试结果
我输出110V电压。
这里适配器通过将110V电压输出对象IV110组合进来实现适配器模式。
三、接口适配器模式
原理:通过抽象类来实现适配 ,这种适配稍别于上面两种模式。
当存在这样一个接口 ,里面定义了n个方法,但我们只想使用里面的一个或者部分方法的时候,如果我们实现接口,我们需要实现该接口的所有方法。哪怕我们对不使用的方法置空,也会有一大堆大括号,使得该实现类臃肿而不优雅。这个时候我们可以使用一个抽象类作为中间件,充当适配器的角色,用这个抽象类去实现接口,而在抽象类中的所有方法都置空,再创建抽象类的继承类,而我们重写我们需要使用的几个方法即可。
下面来演示一个简单的例子就比较明白了:
public interface A{
void a();
void b();
void c();
void d();
void e();
void f();
}
定义我们的适配器:
public class Adapter implements A{
public void a(){}
public void b(){}
public void c(){}
public void d(){}
public void e(){}
public void f(){}
}
覆盖适配器的方法:
pulic class Client extends Adapter{
public void a(){
System.out.println("this is a method.");
}
public void b(){
System.out.println("this is b method.");
}
}
测试我们的类:
public Class TestAdapter{
public static void main(String[] args){
A adapter = new Client();
adapter.a();
adapter.b();
}
}
参考链接:
https://www.cnblogs.com/V1haoge/p/6479118.html
https://www.cnblogs.com/gaobig/p/4844305.html