以下内容摘抄于《C#大话设计模式》
适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式分为类适配器和对象适配器模式。由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,而C#、Java等语言不支持多重继承,也就是一个类只有一个父类,所以此处讲的是对象适配器。
适配器的用途: 当系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
适配器的结构图如下:
Target类:
package com.schema.adapter;
public class Target {
public void Request(){
System.out.println("Normal request." + this.getClass().getName());
}
}
Adaptee类(需要适配的类):
package com.schema.adapter;
public class Adaptee {
public void SpecificRequest(){
System.out.println("Specific request." + this.getClass().getName());
}
}
Adapter类,通过在内部包装一个Adaptee对象,把源接口转换成目标接口:
package com.schema.adapter;
public class Adaptee {
public void SpecificRequest(){
System.out.println("Specific request." + this.getClass().getName());
}
}
客户端代码如下:
package com.schema.adapter;
public class AppMain {
public static void main(String[] args) {
Target adapter = new Adapter();
adapter.Request();
}
}
运行结果如下:
现举例如下:
假设姚明初到NBA,听不懂英文。此时需要为姚明配备一个翻译,此时使用适配器模式。代码如下:
Player类,球员类是所有类型球员的抽象
package com.schema.adapter;
public abstract class Player {
protected String name;
public Player(String name){
this.name = name;
}
public abstract void Attack();
public abstract void Defense();
}
以下分别是前锋、中锋、后卫、翻译和外籍球员
package com.schema.adapter;
public class Forward extends Player {
public Forward(String name){
super(name);
}
public void Attack(){
System.out.println("forward " + name + " Attack");
}
public void Defense(){
System.out.println("forward " + name + " Defence");
}
}
package com.schema.adapter;
public class Center extends Player {
public Center(String name){
super(name);
}
public void Attack(){
System.out.println("Center " + name + " Attack");
}
public void Defense(){
System.out.println("Center " + name + " Defence");
}
}
package com.schema.adapter;
public class Guards extends Player{
public Guards(String name){
super(name);
}
public void Attack(){
System.out.println("Center " + name + " Attack");
}
public void Defense(){
System.out.println("Center " + name + " Defence");
}
}
package com.schema.adapter;
public class Translator extends Player {
private ForeignCenter foreignCenter;
public Translator(String name){
super(name);
this.foreignCenter = new ForeignCenter(name);
}
public void Attack(){
foreignCenter.jingong();
}
public void Defense(){
foreignCenter.fangshou();
}
}
package com.schema.adapter;
public class ForeignCenter {
private String name;
public ForeignCenter(String name){
this.name = name;
}
public void jingong(){
System.out.println("外籍中锋 " + name + " 进攻");
}
public void fangshou(){
System.out.println("外籍中锋 " + name + " 防守");
}
}
客户端代码
package com.schema.adapter;
public class AppMain {
public static void main(String[] args) {
Player b = new Forward("巴蒂尔");
Player m = new Guards("麦克格雷迪");
Player ym = new Translator("姚明");
b.Attack();
m.Defense();
ym.Attack();
ym.Defense();
}
}
运行结果如下: