参考https://www.cnblogs.com/V1haoge/p/6479118.html
定义:
将一个接口转换成用户希望的另一个接口,使两个不相容的接口可以一起工作
包含角色:
1.目标抽象类Target
2.适配器类 Adapter
3.适配者类 Adaptee
分类:
1.类适配器
public class Adapter extends Adaptee implements Target{
@Override
public void xxx(){
dosome();
super.dosome();
}
}
2.对象适配器
public class Adapter extends Target{
//Adaptee为final class
private Adaptee adaptee;
@Override
public void xxx(){
dosome();
adaptee.dosome();
}
}
共同优点:1.将目标类与适配者类解耦,引入一个适配器类来重用现有的适配者类,而无需修改源代码
2.增加了类的透明性和复用性,把具体实现封装在适配者类中
3.灵活性和扩展性都非常好,可以很方便的更换适配器,符合开闭原则
类适配器的缺点:一次只能适配一个适配者类(转换头只能把USB转换成固定孔数),不能将多个适配者类适配到一个接口(不能多继承)
对象适配器的优点:可以把多个适配者类适配到目标接口(可以在构造函数中初始化多个类)
对象适配器的缺点: 与类适配器相比,想要换掉适配者类里面的方法不容易,(类适配器是继承,直接重写,对象适配器是引用)
适用环境:1.系统需要使用现有的类,而这些类的接口不符合系统的需要
2.想要建立一个重复使用的类,把那些没有太多关系的类关联进来一起工作
(1)想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
(2)我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。
以上两个场景其实就是从两个角度来描述一类问题,那就是要访问的方法不在合适的接口里,一个从接口出发(被访问),一个从访问出发(主动访问)。
特别注意:需要针对抽象目标类进行编程
扩展:1.默认适配器,即实现接口的抽象类,
2.双向适配器,把A适配成B,B适配成A
自我猜想:
/** 适配器
* @author Administrator
*
*/
public class AdapterModel {
static interface UserService{
public City queryCityById();
}
static abstract class UserService2{
public abstract City queryCityById();
}
static interface CityService{
public City selById();
}
static class CityServiceImpl implements CityService{
@Override
public City selById() {
return new City();
}
}
static class City{
}
//类适配器
static class UserServiceImpl extends CityServiceImpl implements UserService{
@Override
public City queryCityById() {
return super.selById();
}
}
//对象适配器
static class UserServiceImpl2 extends UserService2{
private CityService cityService;
@Override
public City queryCityById() {
return cityService.selById();
}
}
}