适配器模式(Adapter),讲一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
当系统数据和行为都正确,但是接口不符时,我们应该考虑用适配器,目的是使控制范围外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
PS:即对外部接口进行更进一层的封装
主方法
public class main {
public static void main(String[] args) {
Player b = new Forwards("巴蒂尔");
b.Attack();
Player m = new Guards("麦迪");
m.Attack();
Player ym = new Translator("姚明");
ym.Attack();
ym.Defense();
}
}
抽象类
/**
* 球员抽象类
*/
public abstract class Player {
protected String name;
public Player(String name) {
this.name = name;
}
public abstract void Attack();
public abstract void Defense();
}
实现类
public class Forwards extends Player {
public Forwards(String name) {
super(name);
}
public void Attack() {
System.out.println(String.format("前锋{%s}进攻", name));
}
public void Defense() {
System.out.println(String.format("前锋{%s}防守", name));
}
}
public class Guards extends Player {
public Guards(String name) {
super(name);
}
public void Attack() {
System.out.println(String.format("后卫{%s}进攻", name));
}
public void Defense() {
System.out.println(String.format("后卫{%s}防守", name));
}
}
外部接口
public class ForeignCenter {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void Attack() {
System.out.println(String.format("外籍中锋{%s}进攻", name));
}
public void Defense() {
System.out.println(String.format("外籍中锋{%s}防守", name));
}
}
外部接口适配器类
/**
* 类内部声明并且实例化一个内部“外籍中锋”对象,任何对Translator类Attack和Defense的调用其实就是对内部类的对应方法的调用
*/
public class Translator extends Player {
private ForeignCenter foreignCenter = new ForeignCenter();
public Translator(String name) {
super(name);
foreignCenter.setName(name);
}
public void Attack() {
foreignCenter.Attack();
}
public void Defense() {
foreignCenter.Defense();
}
}