存在一种情况如下:客户端需要调用一个已经存在的A类的行为,但该类与目前使用的相关(B、C)类实现了不同的接口,为了保持统一,客户希望可以使用统一的接口。适配器模式引入了Adaper类,该类实现了与B、C类相同的接口,且封装了A类的行为,客户端可以等同的看到B、C和Adaper类。
实例:设有三个人:外国人Tom(实现接口IPerson);中国人张三(实现接口IPerson):外星人Extraterrestrial,他们分别要作自我介绍,Tom和张三具有相同的接口,他们自我介绍时使用方法Speak,而外星人没有实现IPerson接口,没有方法Speak,不过他有自己自我介绍的方法,叫“噢噢”;客户端并不关心谁是中国人,谁是外国人,谁是外星人,他们希望统一的使用Speak方法,这时就需要一个Adpater类来转换一下。实例代码如下:
IPerson接口:
Code
public interface IPerson
{
string Speak();
}
Tom类:
Code
public class Tom:IPerson
{
#region IPerson 成员
public string Speak()
{
return "I am Tom";
}
#endregion
}
张三类:
Code
public class 张三:IPerson
{
#region IPerson 成员
public string Speak()
{
return "我是张三";
}
#endregion
}
外星人:
Code
class Extraterrestrial
{
public string 噢噢()
{
return "* ^&^ ΨψΦ";
}
}
Adaper类:
Code
class Adapter:IPerson
{
private Extraterrestrial _extraterrestrial;
public Adapter(Extraterrestrial extraterrestrial)
{
_extraterrestrial = extraterrestrial;
}
#region IPerson 成员
public string Speak()
{
return _extraterrestrial.噢噢();
}
#endregion
}
客户端:
Code
public class PersonFactory
{
public enum Person
{
中国人,
外国人,
外星人
}
private static PersonFactory _personFactory;
public static PersonFactory GetInstance()
{
if (_personFactory == null)
{
_personFactory = new PersonFactory();
}
return _personFactory;
}
public IPerson GetPerson(Person personType)
{
switch(personType)
{
case Person.外国人: return new Tom();
case Person.外星人: return new Adapter(new Extraterrestrial());
case Person.中国人: return new 张三();
default: return null;
}
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
public class Client
{
public static void Main()
{
IPerson 外国人 = PersonFactory.GetInstance().GetPerson(PersonFactory.Person.外国人);
IPerson 中国人 = PersonFactory.GetInstance().GetPerson(PersonFactory.Person.中国人);
IPerson 外星人 = PersonFactory.GetInstance().GetPerson(PersonFactory.Person.外星人);
SelfIntroduction(外国人);
SelfIntroduction(中国人);
SelfIntroduction(外星人);
Console.Read();
}
private static void SelfIntroduction(IPerson person)
{
Console.WriteLine(person.Speak());
}
}