适配器模式
适配器模式(Adapter Pattern)充当两个不兼容接口之间的桥梁,属于结构型设计模式。它通过一个中间件(适配器)将一个类的接口转换成客户期望的另一个接口,使原本不能一起工作的类能够协同工作。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
类图示例

举个例子
球员姚明刚来到NBA,听不懂教练布置的战术,所以需要一个翻译来解释教练的战术。这个翻译就是适配器
类图

代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| abstract class Player { protected String name;
public Player(String name) { this.name = name; }
public abstract void Attack();
public abstract void Defense(); }
class Forwards extends Player { public Forwards(String name) { super(name); }
public void Attack() { System.out.println("前锋" + name + "进攻"); }
public void Defense() { System.out.println("前锋" + name + "防守"); } }
class Center extends Player { public Center(String name) { super(name); }
public void Attack() { System.out.println("中锋" + name + "进攻"); }
public void Defense() { System.out.println("中锋" + name + "防守"); } }
class Guard extends Player { public Guard(String name) { super(name); }
public void Attack() { System.out.println("后卫" + name + "进攻"); }
public void Defense() { System.out.println("后卫" + name + "防守"); } }
class ForeignCenter { private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public void jingong() { System.out.println("外籍中锋" + name + "进攻"); }
public void fangshou() { System.out.println("外籍中锋" + name + "防守"); } }
class Translator extends Player { private ForeignCenter foreignCenter = new ForeignCenter();
public Translator(String name) { super(name); foreignCenter.setName(name); }
public void Attack() { foreignCenter.jingong(); }
public void Defense() { foreignCenter.fangshou(); } }
public class Adapter { public static void main(String[] args) { Player b = new Forwards("巴蒂尔"); b.Attack(); Player m = new Guard("麦克格雷迪"); m.Attack(); Player y = new Translator("姚明"); y.Defense(); } }
|
适配器模式包含以下几个主要角色:
- 目标接口(Target):定义客户需要的接口。
- 适配者类(Adaptee):定义一个已经存在的接口,这个接口需要适配。
- 适配器类(Adapter):实现目标接口,并通过组合或继承的方式调用适配者类中的方法,从而实现目标接口。
模式分析
- 优点
- 促进了类之间的协同工作,即使它们没有直接的关联。
- 提高了类的复用性。
- 增加了类的透明度。
- 提供了良好的灵活性。
- 缺点
- 过度使用适配器可能导致系统结构混乱,难以理解和维护。
- 在Java中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。