一,基本介绍
1.将某个类的接口转换成客户端期望的另一个接口表示,主要目的是为了兼容性,让原本因为接口不匹配不能在一起工作的两个类可以协同工作
2.适配器模式属于结构性模式
3.主要分为3类:类适配器模式,对象适配器模式,接口适配器模式
二,案例引入
案例:手机充电器,充电器本省相当于适配器类,220v交流电相当于被适配者,目标是得到手机达到手机要求的电流
1.类适配器
<1>代码
Voltage220V:相当于220v插座口
package 设计模式.适配者模式.类适配器;
public class Voltage220v {
public int outPut220V(){
int src=220;
System.out.println("");
return src;
}
}
Voltage5V:相当于插在手机上的接口
package 设计模式.适配者模式.类适配器;
public interface Voltage5v {
public int outPut5V();
}
VoltageAdaptor:适配器调节电压的装置
package 设计模式.适配者模式.类适配器;
public class VoltageAdaptor extends Voltage220v implements Voltage5v {
@Override
public int outPut5V() {
return outPut220V()/44;
}
}
Phone:手机
package 设计模式.适配者模式.类适配器;
public class Phone{
public void charging(Voltage5v v){
if(v.outPut5V()==5){
System.out.println("电压正常");
}else{
System.out.println("电压异常");
}
}
}
Client
package 设计模式.适配者模式.类适配器;
public class Client {
public static void main(String []args){
Phone phone=new Phone();
phone.charging(new VoltageAdaptor());
}
}
<2>注意事项
----java是单继承机制,所以VoltageAdaptor类需要继承Voltage220V是一缺点
----Voltage220V的方法在VoltageAdaptor会暴露,增加了使用成本
2.对象适配器
<1>VoltageAdaptor继承Voltage220V变成持有Voltage220V的实例对象,继承变为组合
<2>代码
Voltage220V:相当于220v插座口
package 设计模式.适配者模式.对象适配器;
public class Voltage220V {
public int outPut220V(){
int src=220;
System.out.println("");
return src;
}
}
Voltage5V:相当于插在手机上的接口
package 设计模式.适配者模式.对象适配器;
public interface Voltage5V {
public int outPut5V();
}
VoltageAdaptor:适配器调节电压的装置
package 设计模式.适配者模式.对象适配器;
public class VoltageAdaptor implements Voltage5V{
private Voltage220V v;
public VoltageAdaptor(Voltage220V v){
this.v=v;
}
@Override
public int outPut5V() {
return v.outPut220V()/44;
}
}
Phone:手机
package 设计模式.适配者模式.对象适配器;
public class Phone{
public void charging(Voltage5V v){
if(v.outPut5V()==5){
System.out.println("电压正常");
}else{
System.out.println("电压异常");
}
}
}
Client
package 设计模式.适配者模式.对象适配器;
public class Client {
public static void main(String []args){
Phone phone=new Phone();
phone.charging(new VoltageAdaptor(new Voltage220V()));
}
}
3,接口适配器模式
<1>当不需要实现接口所有的方法时,可以先设计一个抽象类实现接口,并为该抽象类中的每一个方法提供一个默认实现,那么抽象类的子类可以有选择的去覆盖父类的某些方法即可
<2>代码
Interface:提供了4个方法
package 设计模式.适配者模式.接口适配器;
public interface Interface {
public void m1();
public void m2();
public void m3();
public void m4();
}
AbsAdaptor:只用得到方法m1
package 设计模式.适配者模式.接口适配器;
public class AbsAdaptor implements Interface {
@Override
public void m1() {
System.out.println("只需要用到方法m1");
}
@Override
public void m2() {
}
@Override
public void m3() {
}
@Override
public void m4() {
}
}
Client
package 设计模式.适配者模式.接口适配器;
public class Client {
public static void main(String []args){
new AbsAdaptor().m1();
}
}