文章目录
1. 适配器模式
1.1 概念
适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
1.2 使用场景
想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,并且在双方都不太容易修改的时候再考虑用适配器模式。
1.3 案例代码
1.3.1 UML类图
1.3.2 客户期待的接口
//客户期待的接口
public class Target {
public void request(){
System.out.println("普通请求");
}
}
1.3.3 需要适配的类
//需要适配的类
public class Adaptee {
public void specificRequest(){
System.out.println("特殊请求");
}
}
1.3.4 适配器类
//适配器类
public class Adapter extends Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.specificRequest();
}
}
1.3.5 客户端代码
Target target = new Adapter();
target.request();
2. 需求
一个球员在NBA打球,如果不懂外语,又没有翻译,球技再高,估计也是不可能在国外待很长时间的。因此,一个外籍球员往往需要一个翻译来进行团队沟通,进行适应。请通过代码实现上面的场景。
3. 实现代码
3.1 UML类图
3.2 球员类
public abstract class Player {
protected String name;
public Player(String name){
this.name = name;
}
public abstract void attack();
public abstract void defense();
}
3.3 具体球员类(中锋、前锋、后卫类)
public class Forwards extends Player{
public Forwards(String name) {
super(name);
}
@Override
public void attack() {
System.out.println("前锋" + this.name+ "进攻");
}
@Override
public void defense() {
System.out.println("前锋" + this.name+ "防守");
}
}
public class Center extends Player{
public Center(String name) {
super(name);
}
@Override
public void attack() {
System.out.println("中锋" + this.name+ "进攻");
}
@Override
public void defense() {
System.out.println("中锋" + this.name+ "防守");
}
}
public class Guards extends Player{
public Guards(String name) {
super(name);
}
@Override
public void attack() {
System.out.println("后卫" + this.name+ "进攻");
}
@Override
public void defense() {
System.out.println("后卫" + this.name+ "防守");
}
}
3.4 外籍球员类
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("外籍中锋" + this.name+ "进攻");
}
public void defense() {
System.out.println("外籍中锋" + this.name+ "防守");
}
}
3.5 翻译者类
public class Translator extends Player{
private ForeignCenter foreignCenter = new ForeignCenter();
public Translator(String name){
super(name);
foreignCenter.setName(name);
}
@Override
public void attack() {
foreignCenter.attack();
}
@Override
public void defense() {
foreignCenter.defense();
}
}
3.6 客户端代码
Player forwards = new Forwards("A球员");
forwards.attack();
Player guards = new Guards("B球员");
guards.attack();
Player center = new Translator("C球员");
center.attack();
center.defense();
3.7 输出结果
前锋A球员进攻
后卫B球员进攻
外籍中锋C球员进攻
外籍中锋C球员防守