适配器模式就是将某个类的接口转换为客户需要的那种接口,让因接口不匹配的类可以一起工作。也就是我们所说的兼容
类适配器:
画图理解:
如果没有这个适配器那么手机是不能直接使用的220v的电压的,所以我们就需要这个适配器的。
那我们的电源适配器是怎么工作,或者说它在我们的Java代码中是怎么实现的呢?
画图理解:
我们的思路就是这么的简单,实现目标接口,就已有继承的属性进行转换:
代码演示:
//创建一个目标接口
interface target{
int out5(); //目标输出
}
//创建一个现有220V电压的Source类
class Source{
int src = 220;
public int out220(){
System.out.println("现有电压:"+src);
return src;
}
}
//创建一个适配器类:
class Adapter extends Source implements target{
public int out5(){
//接收现有的220V电压
int s = out220();
//将得到的220电压转换为5v的电压
int s2 = s/44;
return s2; //将此时的5V电压返回。达到将220--> 5
}
}
//创建一个手机类
class Phone{
//定义一个手机充电的方法
public void chong(target s){
if(s.out5() == 5){
System.out.println("电压转换为5伏可以进行充电");
}else{
System.out.println("电压转换失败,不能进行充电");
}
}
}
//搞一个测试类来进行测试
public class Test{
public static void main(String[] args){
Phone p = new Phone();
p.chong(new Adapter());
}
}
//输出结果:
//现有电压220V
//电压转换为5可以进行充电
对象适配器:
上边的适配器通过继承来获取现有的被适配器的属性,而类适配器与之非常的相似。只是我们不是继承了被适配器,而是创建被适配器对象,通过该对象来获取被适配器的属性
来张图:
代码演示:其中的绝大多数代码不需要改动,所以在类适配器的基础上修改
//创建一个目标接口
interface target{
int out5(); //目标输出
}
//创建一个现有220V电压的Source类
class Source{
int src = 220;
public int out220(){
System.out.println("现有电压:"+src);
return src;
}
}
//创建一个适配器类:
//此时的适配器没有继承被适配器
class Adapter implements target{
//创建一个被适配器对象
private Source source;
//通过构造方法来进行创建对象
public Adapter(Source source){
this.source = source;
}
public int out5(){
//先判断一下创建的对象是否存在
System.out.println("通过对象适配器进行转换");
int s2 = 220; //给定初始值
if(null != source){
int s = source.out220();
//将得到的220电压转换为5v的电压
s2 = s/44;
}
return s2; //将此时的5V电压返回。达到将220--> 5
}
}
//创建一个手机类
class Phone{
//定义一个手机充电的方法
public void chong(target s){
if(s.out5() == 5){
System.out.println("电压转换为5伏可以进行充电");
}else{
System.out.println("电压转换失败,不能进行充电");
}
}
}
//搞一个测试类来进行测试
public class Test{
public static void main(String[] args){
Phone p = new Phone();
p.chong(new Adapter(new Source()));
}
}
//输出结果:
//现有电压220V
//电压转换为5可以进行充电
接口适配器或缺省适配器模式
我们知道当一个类想实现一个接口的时候,必须重写接口中的所有方法(抽象类除外),因此这样不是特别的友好。因此我们就可以使用接口适配器来进行实现接口中的某一特定方法
现在我们可以通过一个抽象类来作为中间类,来间接实现接口
//测试类
public class Test_02 {
public static void main(String[] args) {
//通过匿名对象调用show2方法
new Adapter2() {
public void show() {
System.out.println("只实现show方法");
}
}.show();
//如果我们直接创建接口的匿名对象时就需要重写所有的方法,通过适配器就可以用什么掉什么
}
}
//定义一个接口
interface Fun{
void show();
void show2();
void show3();
}
//定义一个抽象类来实现接口,所有的方法进行空实现
abstract class Adapter2 implements Fun{
@Override
public void show() {
}
@Override
public void show2() {
}
@Override
public void show3() {
}
}