适配器模式
什么是适配器呢?
很简单,就是当我们出去旅游时,充电器有不同的型号插座,国标,美标,欧标,当我们要在外带的是国标的充电器,但插座是欧标的,为了充电,没办法一定要用这个插座,这时该怎么办呢?
土豪做法:直接买新的,哈哈哈,这种做法显然是最可行的,那不是每个人都是土豪,那么,我们就只能用个转接头,这样我们就可以使用这个插座了。
适配器模式就是,某个类的接口转成客户端希望的另一个类的接口表示
这么说还是有点抽象,我们逐一举例子写代码帮助理解
适配器模式主要分为三类,我们逐一进行学习:
1.类适配器模式
2.对象适配器模式
3.接口适配器模式
1. 类适配器模式
下面我们设计一个场景
有一个手机,它需要充电,充电,那么就要电源 但这个电源是220v的,充电器会将220v转成手机可以接受的电压进行充电。220v的电源是被适配值,充电器是适配器,5v是最终适配值
/**
* 类适配器
*/
//被适配类
class Export220V{
public int Export220v(){
int v = 220;
System.out.println("输出220V的电压");
return v;
}
}
//适配类
interface Export5V{
public int Export5v();
}
//适配器
class Adapter extends Export220V implements Export5V{
@Override
public int Export5v() {
int v5 = super.Export220v()/44;
System.out.println("适配器处理后的电压:"+v5);
return v5;
}
}
//手机
class Phone {
public Phone(Export5V export5V){
charge(export5V);
}
// 充电,这里只能接受5v的电压,所以只能传递5v的电压
public void charge(Export5V volt){
if(volt.Export5v()==5){
System.out.println("电压为五伏,可以充电");
}else {
System.out.println("电压不稳,不可以充电");
}
}
}
这样处理后:
客户端只要传入一个适配器,就可以完成5v电压的适配了。
2.对象适配器
对象适配器就是在类适配器的基础上,去掉继承关系,采用聚合组合的方式,进行,满足合成复用原则。
//对象适配器
//将继承关系去掉采用聚合组合的方式替代
class Adapter2 implements Export5V{
private Export220V export220V;
public Adapter2(Export220V export220V){
this.export220V = export220V;
}
@Override
public int Export5v() {
int v5 = export220V.Export220v()/44;
System.out.println("适配器处理后的电压:"+v5);
return v5;
}
}
3.接口适配器
当一个接口,我们在使用它时,不希望重写它全部的方法,而是使用其某一个方法时,这时候,我们要使用接口适配器。
做法:
用一个抽象类继承该接口,默认实现该接口全部方法,之后通过匿名内部类的方式,重写需要的方法即可:
/**
* 接口适配器模式
*/
interface InterfaceTest{
void method01();
void method02();
void method03();
void method04();
}
abstract class AbsAdapter implements InterfaceTest{
@Override
public void method01(){
}
@Override
public void method02(){
}
@Override
public void method03(){
}
@Override
public void method04(){
}
}
// 采用匿名内部类的方式
AbsAdapter adapter = new AbsAdapter() {
// 我们只需要method1
@Override
public void method01() {
System.out.println("m1方法");
}
};
adapter.method01();
}