适配器模式 adapter

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


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

野鸭
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public   class  MallardDuck : Duck
    
{
        
public MallardDuck()
        
{}

        
Duck Members#region Duck Members

        
public string Quack()
        
{
            
return "Quack";
        }


        
public string Fly()
        
{
            
return "I'm flying";
        }


        
#endregion

    }


火鸡接口
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public   interface  Turkey
    
{
        
string Gobble();
        
string Fly();
    }


野火鸡
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public   class  WildTurkey : Turkey
    
{
        
public WildTurkey()
        
{}

        
Turkey Members#region Turkey Members

        
public string Gobble()
        
{
            
return "Gooble, gooble";
        }


        
public string Fly()
        
{
            
return "I'm flying a short distance";
        }


        
#endregion

    }

鸭子适配器
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public   class  DuckAdapter : Turkey
    
{
        Duck duck;

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


        
Turkey Members#region Turkey Members

        
public string Gobble()
        
{
            
return duck.Quack();
        }


        
public string Fly()
        
{
            
return duck.Fly();
        }


        
#endregion

    }

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值