适用场合:当我们想使用一个已经存在的类,但是它的方法(就是接口)和你的要求不同时就应该考虑使用适配器模式,更具体些就是当两个类所做的事情相同,但是他们具有不同的接口时就应该考虑使用它,这时客户端代码就可以统一的调用接口了,这样就可以 更简单、更直接、更紧凑。
这是个什么设计模式呢?上面介绍的适用场合就是适配器模式,它将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本接口不兼容而不可以一起工作的那些类可以一起工作。
下面是相关的结构代码:
1 抽象类Player.java
package com.ops.adapter;
public abstract class Player {
protected String name = null;
public abstract void Attack();
public abstract void Defense();
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2 Forwards.java、Center.java、Guards.java三个Java文件实现上面的抽象类
2.1 Forwards.java
package com.ops.adapter.base;
import com.ops.adapter.Player;
public class Forwards extends Player {
public Forwards(String name) {
super(name);
}
@Override
public void Attack() {
System.out.printf("前锋%s进攻\n", this.name);
}
@Override
public void Defense() {
System.out.printf("前锋%s防守\n", this.name);
}
}
2.2 Center.java
package com.ops.adapter.base;
import com.ops.adapter.Player;
public class Center extends Player {
public Center(String name) {
super(name);
}
@Override
public void Attack() {
System.out.printf("中锋%s进攻\n", this.name);
}
@Override
public void Defense() {
System.out.printf("中锋%s防守\n", this.name);
}
}
2.3 Guards.java
package com.ops.adapter.base;
import com.ops.adapter.Player;
public class Guards extends Player {
public Guards(String name) {
super(name);
}
@Override
public void Attack() {
System.out.printf("后卫%s进攻\n", this.name);
}
@Override
public void Defense() {
System.out.printf("后卫%s防守\n", this.name);
}
}
3 上面是不需要适配器的实现类,这里的Translator则是适配器类,适配了里面的foreignCenter对象,因为该对象与客户端调用代码的接口不一致。
3.1 Translator.java
package com.ops.adapter.base;
import com.ops.adapter.Player;
/**
* 使用翻译者作为来告诉外籍中锋进行工作,这里用作适配器.
* @author xuecheng
*
*/
public class Translator extends Player {
private ForeignCenter foreignCenter = null;
public Translator(String name) {
super(name);
foreignCenter = new ForeignCenter(name);
}
@Override
public void Attack() {
foreignCenter.AttackTranstalor();
}
@Override
public void Defense() {
foreignCenter.DefenseTranstalor();
}
}
3.2 ForeignCenter.java
package com.ops.adapter.base;
public class ForeignCenter {
private String name = null;
public ForeignCenter(String name) {
this.name = name;
}
public void AttackTranstalor() {
System.out.printf("外籍中锋%s进攻\n", this.name);
}
public void DefenseTranstalor() {
System.out.printf("外籍中锋%s防守\n", this.name);
}
}