我们看篮球的时候,经常看到前锋中锋后卫针对球场形式进行进攻或防守。
但是对于需要翻译的外籍球员,就需要配备一个翻译员才能听懂教练的战术。
我们看下这个场景下,用适配器模式如何实现。
首先我们定义基本类,球员基类。
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);
}
@Override
public void Attack() {
System.out.println("前锋("+name+")进攻");
}
@Override
public void Defense() {
System.out.println("前锋("+name+")防守");
}
}
中锋
public class Center extends Player{
public Center(String name) {
super(name);
}
@Override
public void Attack() {
System.out.println("中锋("+name+")进攻");
}
@Override
public void Defense() {
System.out.println("中锋("+name+")防守");
}
}
后卫
public class Guards extends Player{
public Guards(String name) {
super(name);
}
@Override
public void Attack() {
System.out.println("后卫("+name+")进攻");
}
@Override
public void Defense() {
System.out.println("后卫("+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("外籍中锋("+name+")进攻");
}
public void Defense() {
System.out.println("外籍中锋("+name+")防守");
}
}
再为外籍中锋配备一个翻译类,同样继承自Player基类
public class Translator extends Player{
private ForeignCenter wjzf = new ForeignCenter();
public Translator(String name) {
super(name);
wjzf.setName(name);
}
@Override
public void Attack() {
wjzf.Attack();
}
@Override
public void Defense() {
wjzf.Defense();
}
}
这样我们前期的定义就算做完了,
然后我们看具体应用中的使用。
看在具体业务逻辑中如何使用
public class AdapterTest {
public static void main(String[] args) {
//适配器模式
func1();
}
public static void func1(){
Player a = new Forwards("麦迪");
a.Attack();
Player b = new Center("乔丹");
b.Attack();
Player c = new Guards("艾弗森");
c.Defense();
Player d = new Translator("姚明");
d.Attack();
d.Defense();
}
}
前锋(麦迪)进攻
中锋(乔丹)进攻
后卫(艾弗森)防守
外籍中锋(姚明)进攻
外籍中锋(姚明)防守
适配器模式,将一个类的接口,转换为客户想要的另一个类的接口。
适配器模式使得原本不兼容的接口可以一起工作。
那什么时候该考虑使用适配器模式呢?
在我们想使用一个已经存在的类,但由于接口也就是它的方法和你的要求不一致时,
就该考虑使用适配器模式了。