适配器模式(Adepter),将一个类的接口转换成客户希望的另外一个接口。Adepter模式使得原本由于模式不兼容而不能一起工作的那些类,可以一起工作。
在软件开发中,当系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器模式,目的是使控制范围之外的一个原有对象与某个接口匹配,适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境不一致的情况,比如要在需要对早起代码复用,一些功能等应用上很有实用价值。
适配器模式UML类图:

分析:
Target是客户所期待的接口,目标可以是具体的或抽象的类也可以是接口;Adeptee是需要适配的类;Adepter是适配器类,通过在内部包装一个Adeptee对象把源接口转换成目标接口。
适配器模式实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Adepter
{
    /*
     * 这是客户所期待的接口,目标可以是具体的或抽象的类也可以是接口
     */
    class Target
    {
        public virtual void Request()
        {
            Console.WriteLine("普通请求...");
        }
    }
    /**
     * 需要适配的类
     */
    class Adeptee
    {
        public void SpecificRequest()
        {
            Console.WriteLine("特殊请求...");
        }
    }
    /*
     * Adepter通过在内部包装一个Adeptee对象把源接口转换成目标接口
     */
    class Adepter : Target
    {
        private Adeptee adeptee = new Adeptee();//这是一个私有的Adeptee对象
        public override void Request()
        {
            this.adeptee.SpecificRequest();//这样就可以把表面调用Request()方法,转换为调用SpecificRequest()方法
            //base.Request();
        }
    }
}
客户端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Adepter
{
    class Program
    {
        static void Main(string[] args)
        {
            Target target = new Adepter();
            target.Request();//对客户来说,调用的就是Target的Request()
            Console.Read();
        }
    }
}
适配器模式总结:
当使用一个已经存在的类,但是它的接口也就是它的方法或你的要求不相同时;两个类所做的事情相同或者相似但是接口不同时,应该考虑使用适配器模式。这样客户可以统一调用一个接口,从而更简单、更直接、更紧凑。
适配器模式案例—篮球翻译适配器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AdepterExample
{
    abstract class Player
    {
        private string name;
        public Player(string name)
        {
            this.name = name;
        }
        public string getName()
        {
            return this.name;
        }
        public void setName(string name)
        {
            this.name = name;
        }
        public abstract void Attack();
        public abstract void Defense();
    }
    class Forwards : Player
    {
        public Forwards(string name):base(name){}
        public override void Attack()
        {
            Console.WriteLine("前锋{0},进攻!",this.getName());
            //throw new NotImplementedException();
        }
        public override void Defense()
        {
            Console.WriteLine("前锋{0},防守!", this.getName());
            //throw new NotImplementedException();
        }
    }
    class Center : Player
    {
        public Center(string name) : base(name) { }
        public override void Attack()
        {
            Console.WriteLine("中锋{0},进攻!", this.getName());
            //throw new NotImplementedException();
        }
        public override void Defense()
        {
            Console.WriteLine("中锋{0},防守!", this.getName());
            //throw new NotImplementedException();
        }
    }
    class Guards : Player
    {
        public Guards(string name) : base(name) { }
        public override void Attack()
        {
            Console.WriteLine("后卫{0},进攻!", this.getName());
            //throw new NotImplementedException();
        }
        public override void Defense()
        {
            Console.WriteLine("后卫{0},防守!", this.getName());
            //throw new NotImplementedException();
        }
    }
    class ForeignCenter
    {
        private string name;
   
        public string getName()
        {
            return this.name;
        }
        public void setName(string name)
        {
            this.name = name;
        }
        public void 进攻()
        {
            Console.WriteLine("外籍中锋{0},进攻!", this.name);
        }
        public void 防守()
        {
            Console.WriteLine("外籍中锋{0},防守!",this.name);
        }
    }
    class Adepter : Player
    {
        private ForeignCenter foreignCenter = new ForeignCenter();
        public Adepter(string name) : base(name) 
        {
            foreignCenter.setName(name);
        }
        public override void Attack()
        {
            foreignCenter.进攻(); 
            //throw new NotImplementedException();
        }
        public override void Defense()
        {
            foreignCenter.防守();
            //throw new NotImplementedException();
        }
    }
}
客户端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AdepterExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Player p1 = new Forwards("巴蒂尔");
            Player p2 = new Adepter("姚明");
            Player p3 = new Guards("麦克格雷迪");
            p1.Attack();
            p2.Attack();
            p3.Attack();
            p2.Defense();
            Console.Read();
        }
    }
}
运行结果:

 
                    
                     
                    
                 
                    
                
 
         
 
                
            
        
 浙公网安备 33010602011771号
浙公网安备 33010602011771号