当源角色有多个时,因为java不支持多继承,适配器角色则需要使用类关联的实现方法
目标角色
public interface Target {
//目标角色有自己的方法
public String request1();
public String request2();
public String request3();
}
源角色1
public interface IAdaptee1 {
public void doSomething1();
}
源角色2
public interface IAdaptee2 {
public void doSomething2();
}
源角色3
public interface IAdaptee3 {
public void doSomething3();
}
接口实现
源角色1的实现类
public Class Adaptee1 implement IAdaptee1 {
public void doSomething1();
}
源角色2的实现类
public Class Adaptee2 implement IAdaptee2{
public void doSomething2();
}
源角色3的实现类
public Class Adaptee3 implement IAdaptee3{
public void doSomething3();
}
适配器角色 (因为是多个源角色,无法指定父类,所以只实现目标角色的接口)
public class Adapter implement Target {
//源角色对象
private IAdaptee1 adaptee1 = null; //源角色1
private IAdaptee2 adaptee2 = null; //源角色2
private IAdaptee3 adaptee3 = null; //源角色3
//构造函数传递对象
public Adapter (IAdaptee1 _a1,IAdaptee2 _a2, IAdaptee3 _a3){
this.adaptee1 = _a1;
this.adaptee2 = _a2;
this.adaptee3 = _a3;
}
public void request1(){
adaptee1.doSomething();
}
public void request2(){
adaptee2.doSomething();
}
public void request3(){
adaptee3.doSomething();
}
}
场景类
public class Client {
public static void main(String[] args){
IAdaptee1 _a1 = new Adaptee1 ();
IAdaptee1 _a2 = new Adaptee2 ();
IAdaptee1 _a3 = new Adaptee3 ();
ITarget target = new Adapter (_a1, _a2 , _a3 );
target.request1();
target.request2();
target.request3();
}
}
这种适配器模式的委托是通过对象层次的关联关系进行委托的,而不是继承关系,这种适配器叫做对象适配器,而之前讲的是通过继承进行的适配,叫做类适配器
对象适配器和类适配器的区别是:类适配器是类间继承,对象适配器是对象的合成关系,也可以说是类的关联关系
由于对象适配器是通过类间的关联关系进行耦合的,因为设计时会比较灵活,比如修补源角色的隐形缺陷,关联其他对象等,而类适配器只能通过覆写源角色的方法进行扩展。在实际项目中,对象适配器使用到的场景相对比较多
最佳实践
适配器模式是一个补偿模式,或者说是一个“补救”模式,它通过把非本系统接口的对象包装成本系统可以接受的对象,从而简化了系统大规模变更的风险