对象适配器与类适配器
什么是适配器(Adapter)?
顾名思义就是为了配合你新的需求把某个东西调配成合适你用的东西,就是适配器,是个人的解释哈。
那么对象适配器与类适配器两者有什么区别?
通过下面举例子来说明。
【鸟】
/ \
【鸡】 【鹰】
上面这个图是我随便画的哈,懒得用画图了。
解释下,就是,有鸟这种基类,然后鸡和鹰分别是它的子类。
鸡和鹰继承了鸟...拥有鸟的基本特征。
那么在不破坏原有设计的基础上想让鸡和鹰都拥有鸣叫的功能怎么办??
记住前提是不破坏原来的设计,所以你不要告诉我在鸟那里添加个抽象方法然后下面继承去重写
那怎么办呢?这个时候适配器出现鸟。
我们可以在下面搞多个类适配器(就是类)继承鸡和鹰呀。
如下: 【鸟】
/ \
【鸡】 【鹰】
| |
【鸡的适配器】 【鹰的适配器】
类适配器就是继承他们父类的一个类啦,然后在适配器里面添加鸣叫的方法或者继承一个有鸣叫功能的接口。
这就满足我们的需求啦,我们的要求也搞定了,但是想想不对啊,如果有很多个动物,比如鸭,鹅,神马的...
他们也要有鸣叫的功能,那是不是要创建很多个适配器啊,天啊...
于是乎,对象适配器就来鸟。
什么是对象适配器??看招,看下图
【鸟】 【鸣叫接口】
/ | \ |
【鸡】 【鹰】【鸟的适配器】
鸟的适配器依赖于鸟...看清楚我画的是\红色的,这货不是继承,只是刚好有鸟的所有字段和方法,然后它再继承鸣叫的接口
于是它就有鸣叫的功能鸟。
接下来,见证奇迹的时候到了。该写代码鸟,不能偷懒。
1 public class BirdAdapter : ISay 2 { 3 private Bird _bird; 4 public BirdAdapter(Bird bird) 5 { 6 _bird=bird; 7 } 8 public void Tosay() 9 { 10 //不同动物实现不同的叫法。。。 11 } 12 } 13 14 --------- 15 main() //我简略的写,表示是主方法 16 { 17 BirdAdapter ba=new BirdAdapter(new Chicken()); 18 ba.Tosay(); 19 }
ISay是一个接口,实现鸣叫功能的哦。。。上面没有写。。
基本讲完鸟,顺便讲下,很多人看到 Bird bird=new Chicken();
不明白有何用意,或者这样会有什么结果。
这里有2个原则,就是关注对象原则,还有执行就行原则。
就是,如果bird.调用一个子类和父类相同名字的方法的时候,到底是执行是哪一个的方法呢?
取决于创建对象的是子类还是父类对象。