在NBA现役中锋期,姚明也算是一个天才吧。姚明NBA打球,交流是一个很大的的问题,那么怎么解决呢?为他配一个翻译啦。
这里就和软件工程中的一个模式很相似,适配器模式。
模式定义
适配器模式(Adapter),将一个类的接口装换成客户希望的另外一个接口。Adapter模式使得原本不兼容而不能在一起工作的那些类可以一起工作。【DP】
模式结构
模式实现
球员
package com.bjsxt.adapter;
abstract class Player {
protected String name;
public Player(String name) {
this.name = name;
}
public abstract void attack();
public abstract void defense();
}
前锋
package com.bjsxt.adapter;
public class Forwards extends Player {
public Forwards(String name) {
super(name);
}
public void attack() {
System.out.println("前锋" + name + "进攻!");
}
public void defense() {
System.out.println("前锋" + name + "防守!");
}
}
后卫
package com.bjsxt.adapter;
public class Guards extends Player {
public Guards(String name) {
super(name);
}
public void attack() {
System.out.println("中锋" + name + "进攻!");
}
public void defense() {
System.out.println("中锋" + name + "防守!");
}
}
外籍中锋
package com.bjsxt.adapter;
public class ForeignCenter {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void 进攻(){
System.out.println("外籍中分" + name + "进攻!");
}
public void 防守(){
System.out.println("外籍中分" + name + "防守!");
}
}
翻译者类
package com.bjsxt.adapter;
public class Translator extends Player {
private ForeignCenter wjzf = new ForeignCenter();
public Translator(String name) {
super(name);
wjzf.setName(name);
}
public void attack() {
wjzf.进攻();
}
public void defense() {
wjzf.进攻();
}
}
测试类
package com.bjsxt.adapter;
public class Client {
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();
}
}
使用场景
使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,应该思考用适配器模式。也就是讲,两个类所做的事情相同或相似,但是具有不同的接口时要使用它。
模式优缺点
优点
1、可以让两个没有关联的类一起运行
2、提高类的复用。
3、增加类的透明度,提高灵活度。
缺点
1、过多的使用适配器,会让系统非常的凌乱,不易于整体把握。比如,明明可以调用的是A接口,其实内部被适配成B接口实现,一个系统如果太多出现这种情况,无异于是一场灾难。因此不是很有必要的时候,可以不适用适配器,而是直接对系统进行重构。
2、由于Java至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
模式总结
当我们需要使用的一个现有的类,但是他的接口并不符合我们的需求时,我们可以使用适配器模式。