适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。
类图:


  用最直白的话说就是:正写着ClassA的代码的时候发现我要实现的功能很大一部分都在ClassB里已经实现了。那好直接拿着来用呗。但别人调用的时候要的是ClassA不是ClassB啊,当然你的设计不是那么僵化的话需要的会是IClassA。那行你不是要IClassA吗,ClassA实现IClassA接下来重复的代码就不写了,把工作都委托给ClassB吧。
鸭子接口
    public interface Duck
    
{
        
string Quack();
        
string Fly();
    }

野鸭
public class MallardDuck : Duck
    
{
        
public MallardDuck()
        
{}

        
Duck Members
    }


火鸡接口
public interface Turkey
    
{
        
string Gobble();
        
string Fly();
    }


野火鸡
public class WildTurkey : Turkey
    
{
        
public WildTurkey()
        
{}

        
Turkey Members
    }

鸭子适配器
public class DuckAdapter : Turkey
    
{
        Duck duck;

        
public DuckAdapter(Duck duck)
        
{
            
this.duck = duck;
        }


        
Turkey Members
    }

   有一天你老爹更跟你说:“儿啊,爹现在很无聊想听听鸟叫”。你马上犯难了,家鸡好找,野鸟难求啊。诶,隔壁王二家不是昨天买了只火鸡吗。但可火鸡也不是鸟啊。
不过经过你一番思考,经过你那天马行空高度抽象的思维,把火鸡修剪修剪羽毛,吃点润喉片就适配成鸟了(其实到底是不是无所谓啦,关键是你老爹认就行,他这个编译器不给你报个错:"类型不匹配"就一切OK!)。
    另外补充一点对继承和实现接口的看法。继承什么说明是什么,实现什么说明能看成什么(能当什么用)。比如说你继承了人这个类那你本质上就是一个人。你实现了律师接口,就是说国家(编译器)承认你的律师资格,人家可以把你当律师来用。接口就是发给一个类的资格证。

适配器有两种实现方式,上面的这种是对象适配器。还有一种类适配器。使用对象适配器的时候我们会发现,一个接口非常大的话,我们会比较郁闷。虽然是委托给别人做但是一百个方法也得委托一百次啊。要是能用继承多好啊,该重写的重写,不要重写的用原有的,不要去实现一个接口里几百个方法。比若说我用一个类继承野鸭,同时继承野火鸡,这样既是野鸭也是火鸡了。可惜java,c#之类的语言不能实现,用不到,就只能当长长见识了。