学习技术的过程老是须要慢慢积累的,因此持续学习是一个一直存在的事情。很高兴,我能一直经过看书输出设计模式相关的系列,也很感谢各位朋友的持续关注。java
废话很少说啦,今天咱们继续学习一个对于Android开发来讲可能不太陌生的模式,适配器模式和外观模式。曾经或者如今正在作Android开发的你,是否是很熟悉这个呢?对的,Android里不少控件,可都是须要适配器来处理的噢,那咱们赶忙进来看看吧。设计模式
适配器是什么,你必定不难理解,由于现实就存在。比方说,若是你须要在欧洲国家使用美国制造的笔记本电脑,你可能须要使用一个交流电的适配器...它的工做是将欧式插座转换成美式插座,好让美式插头能够插进这个插座获得电力。学习
这就是真实世界的适配器,那面向对象适配器又是什么?其实,适配器和真实世界的适配器扮演着一样的角色:将一个接口转换成另外一个接口,以符合客户的指望。用一个形象点的图表示就是:测试
有了前面的铺垫,咱们来看下下面这个场景。若是它走起路来像只鸭子,叫起来像只鸭子,你以为他必定是一只鸭子吗?如今这个答案就未必是确定的回答了,它多是一只包装了鸭子适配器的火鸡。this
结合第一章的鸭子的例子,咱们在这里好好利用起来。先来看看鸭子接口和类的一个稍微简化的版本:设计
// 叶子实现了Duck接口,具有呱呱叫和飞行的能力 public interface Duck { public void quack(); public void fly(); }
绿头鸭是鸭子的子类:code
public class MallardDuck implements Duck { public void quack() { System.out.println("Quack"); } public void fly() { System.out.println("I'm flying"); } }
这里为您介绍最新的“街头顽禽”:对象
// 火鸡不会呱呱叫,只会咯咯叫 public interface Turkey { public void gobble(); public void fly(); } // 火鸡的具体实现 public class WildTurkey implements Turkey { public void gobble() { System.out.println("Gobble gobble"); } public void fly() { System.out.println("I'm flying a short distance"); } }
正常状况下,是按照上面的流程来就行了。可是如今若是你缺乏鸭子对象,想用一些火鸡对象来冒充。可是两个根本不是同一个东西,怎么冒充呢?适配器模式的威力就来了。blog
// 首先,你须要实现想转换成的类型接口,也就是你的客户所指望看到的接口 public class TurkeyAdapter implements Duck { Turkey turkey; // 接着,须要取得适配器的对象引用 public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } // 咱们须要实现接口中的方法。quack()在类之间的转换,只须要调用gobble便可 public void quack() { turkey.gobble; } public void fly() { for(int i = 0; i < 5; i++) { turkey.fly(); } } }
public class DuckTestDrive { public static void main(String[] args) { // 建立一只鸭子 MallardDuck duck = new MallardDuck(); // 建立一只火鸡 WildTurkey turkey = new WildTurkey(); // 将火鸡包装进一个火鸡的适配器中,使他看起来像一只鸭子 Duck turkeyAdapter = new TurkeyAdapter(turkey); System.out.println("The Turkey says..."); // 测试这只火鸡 turkey.gobble(); turkey.fly(); // 测试鸭子,传入一个鸭子对象 System.out.println("\nThe Duck says..."); testDuck(duck); System.out.println("\nThe TurkeyAdapter says..."); // 重点在这,咱们传入一个伪装是鸭子的火鸡 testDuck(turkeyAdapter); } static void testDuck(Duck duck) { duck.quack(); duck.fly(); } }
看了上面的例子,是否是以为适配器很神奇呢。经过以假换真的方式实现了火鸡带鸭子的功能。那咱们来看下,究竟是怎么一回事接口
客户使用适配器的过程以下:
玩够了鸭子、火鸡和交流电适配器,如今让咱们进入真实世界,并看看适配器模式的正式定义:
适配器模式将一个类的接口,转换成客户指望的另外一个接口,适配器让本来接口不兼容的类能够合做无间。
转换成类图就是:
这个适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者;这种作法还有额外的优势,那就是,被适配者的任何子类,均可以搭配着适配器使用。
也请留意,这个模式是如何把客户和接口绑定起来,而不是和实现绑定起来的。咱们可使用数个适配器,每个都负责转换不一样组的后台类。或者,也能够加上新的实现,只要它们遵循目标接口就能够。
哈哈,讲到这里适配器模式差很少就介绍完了。小编曾经写Android的时候,都不知道适配器是啥东西,只知道盲目的使用。学了设计模式,终于知道适配器是干吗 用的了。Andorid世界里,那么多须要使用适配器的控件,你如今清楚了吗?
下次咱们将介绍外观模式,咱们下次再会。
爱生活,爱学习,爱感悟,爱挨踢