概念
适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
特点
适配器模式:方法名改变,就是一个方法转接的过程
适配器模式最典型的例子:日志中的slf4j,它是一个门面层,具体的实现是log4j,logback,commonlogging…,我们调用的时候用它的门面层,配置文件配置门面层的实现,可以指向不同的实现。
适应场景
- 系统的数据和行为都是正确的,但是结构不符时,应该考虑适配器模式,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用与希望复用一些现存的类,但是接口又与复用情况不一致的情况。
- 使用一个已经存在的类,但如果它的接口,也就是它的方法和你要求不相同时,就应该考虑适配器模式
- 两个类所做的事情相同或类似,但是具有不同的接口时使用它
- 使得客户代码可以统一调用同一个接口就可以了,更简单、直接、紧凑
- 在双方都不太容易修改的时候再使用适配器模式适配
分类
类适配器模式
对象适配器模式
实现
- 定义一个人物接口
public abstract interface Player {
public abstract void Attack();
public abstract void Defense();
}
- 具体人员实现人物接口
public class Forwards implements Player {
@Override
public void Attack() {
System.out.println("前锋进攻");
}
@Override
public void Defense() {
System.out.println("前锋防守");
}
}
- 要适配的类
public class ForeignForwards {
private String name;
public void 进攻(){
System.out.println("外籍人员进攻");
}
public void 防守(){
System.out.println("外籍人员防守");
}
}
适配器:
public class Ttanslator implements Player {
private ForeignForwards foreignForwards = new ForeignForwards();//私有化声明并实例化一个内部类,表明翻译者与外籍前锋的关系,即Ttanslator 与ForeignForwards的关系
@Override
public void Attack() {
foreignForwards.进攻();
}
@Override
public void Defense() {
foreignForwards.防守();
}
}
- 主类
public static void main(String[] args) {
Player player = new Ttanslator();
player.Attack();
player.Defense();
}
总结
主要的就是在起到适配器作用的类中,私有化一个要适配类的对象,重写父类方法,调用要适配的类的方法。