一、适配器模式
适配器模式是将一个类的接口变换成为客户端所期望的另外一种接口,从而使原来因接口不匹配而无法在一起工作的两个类能够协同工作,主要目的是兼容性。
适配器模式属于结构型模式,这里介绍两种,一种是类适配器模式,一种是缺省适配器模式
适配器模式的使用场景:
1.系统需要使用现有的类,而这些类的接口不符合系统的需要;
2.想要建立一个可以重复利用的类,用于与彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作;
3.需要一个统一的输出接口,而输入端的类不可知;
1.1 类适配器模式
类适配器模式就是需要一个Adaptor类,通过继承Adaptee类,实现AdapteeTarget接口,完成Adaptee到AdapteeTarget的适配。
适配器用充电的例子做最好了
先写一个Adaptee类:
package com.westos.mode.adaptor;
public class Adaptee {
public void dianya220v(){
System.out.println("这是一个220V的电压");
}
public void jiekouleixing(){
System.out.println("这是一个三相接口");
}
}
定义一个AdapteeTarget接口:
package com.westos.mode.adaptor;
public interface AdaptorTarget {
void dianya();
void leixing();
}
定义一个适配器Adapto类继承Adaptee类实现AdapteeTarget接口:
package com.westos.mode.adaptor;
public class Adaptor extends Adaptee implements AdaptorTarget{
@Override
public void dianya() {
dianya220v();
System.out.println("更改电压的数值为12V");
}
@Override
public void leixing() {
jiekouleixing();
System.out.println("更改接口为两相");
}
}
定义一个手机Mobel类,写一个充电方法:
package com.westos.mode.adaptor;
public class Mobel {
public void chongdian(AdaptorTarget at){
System.out.println("给手机充电了。。。。");
at.dianya();
}
}
测试代码:
//旧适配器的测试
AdaptorTarget adaptor=new Adaptor();
// adaptor.dianya();
// adaptor.leixing();
Mobel mobel=new Mobel();
mobel.chongdian(adaptor);
输出结果如图:
这种类适配器模式由于是Adaptor类继承了Adaptee类,可以根据要求重写Adaptee的方法,增强了Adaptor类的灵活性,但从面向对象编程的原则来说,尽量使用组合/聚合复用原则,应少使用继承达到目的,从这里我们便引入了缺省适配器模式,不通过继承Adaptee类,而是通过在Adaptor类中直接使用Adaptee类的实例完成适配的目的,即在类适配器模式中改造Adaptor类即可。
新的Adaptor类如下:
package com.westos.mode.adaptor;
public class NewAdaptor implements AdaptorTarget{
//使用组合模式原则对象,并不使用继承的方式
private Adaptee adaptee;
public NewAdaptor(Adaptee adaptee) {
this.adaptee=adaptee;
}
@Override
public void dianya() {
adaptee.dianya220v();
System.out.println("新适配器决定将电压改成5V");
}
@Override
public void leixing() {
adaptee.jiekouleixing();
System.out.println("新适配器的类型为为四相接口,不过我没见过....");
}
}
测试代码如下:
Adaptee adaptee=new Adaptee();
AdaptorTarget adaptor2=new NewAdaptor(adaptee);
// adaptor2.dianya();
// adaptor.leixing();
Mobel mobel=new Mobel();
mobel.chongdian(adaptor2);
输出结果如下:
缺省适配器模式和类适配器模式核心实现相同,只是在细节上缺省适配器模式要好于类适配器模式