存在一种情况如下:客户端需要调用一个已经存在的A类的行为,但该类与目前使用的相关(B、C)类实现了不同的接口,为了保持统一,客户希望可以使用统一的接口。适配器模式引入了Adaper类,该类实现了与B、C类相同的接口,且封装了A类的行为,客户端可以等同的看到B、C和Adaper类。

实例:设有三个人:外国人Tom(实现接口IPerson);中国人张三(实现接口IPerson):外星人Extraterrestrial,他们分别要作自我介绍,Tom和张三具有相同的接口,他们自我介绍时使用方法Speak,而外星人没有实现IPerson接口,没有方法Speak,不过他有自己自我介绍的方法,叫“噢噢”;客户端并不关心谁是中国人,谁是外国人,谁是外星人,他们希望统一的使用Speak方法,这时就需要一个Adpater类来转换一下。实例代码如下:
IPerson接口:
 

 Code
Code
 public interface IPerson
    {
        string Speak();
    }Tom类:
 

 Code
Code
    public class Tom:IPerson
    {
        #region IPerson 成员
        public string Speak()
        {
            return "I am Tom";
        }
        #endregion
    }张三类:
 

 Code
Code
 public class 张三:IPerson
    {
        #region IPerson 成员
        public string Speak()
        {
            return "我是张三";
        }
        #endregion
    }外星人:
 

 Code
Code
class Extraterrestrial
    {
        public string 噢噢()
        {
            return "* ^&^ ΨψΦ";
        }
    }Adaper类:
 

 Code
Code
 class Adapter:IPerson
    {
        private Extraterrestrial _extraterrestrial;
        public Adapter(Extraterrestrial extraterrestrial)
        {
            _extraterrestrial = extraterrestrial;
        }
        #region IPerson 成员
        public string Speak()
        {
            return _extraterrestrial.噢噢();
        }
        #endregion
    } 
 
客户端:
 

 Code
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());
        }
    }