属于结构型模式。适配器这三个字在生活中很常见。举个最简单的例子,那就是变压器,它可以把几万伏的高压变成我们生活用电220伏。
变压器就是一种适配器。适配器模式的作用就和生活中的适配器的作用是很相似的。
总之就是将某个类的接口转换成客户端期望的另一个接口表示。
属于结构型模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式
类的适配器模式:
比如我们游戏中有一个马的类Horse,如下:
package com.pattern.struct.adapter.cla; public class Horse {//马 public void walk(){ System.out.println("I can walk..."); } }
只有一个walk(行走)方法。有很多马都调用我这个walk接口(方法)。但是之后其中有一种要求马要能fly(飞行)。
这时候我们怎么办呢?最简单的方法就是,直接在Horse类中加一个fly方法。但是有个问题,我们这么一加之后所有的马都能
飞了,毕竟只有一个种马会飞。我们用适配器模式来实现。
首先确定这种马需要的接口。
package com.pattern.struct.adapter.cla; public interface HorseFly { public void walk(); public void fly(); }
适配器
package com.pattern.struct.adapter.cla; public class AdapterFly extends Horse implements HorseFly{ @Override public void fly() { System.out.println("I can fly..."); } }
package com.pattern.struct.adapter.cla; public class Client { /** * @param args */ public static void main(String[] args) { HorseFly adapter = new AdapterFly(); adapter.walk(); adapter.fly(); } }
这里面有个奇妙的问题 接口HorseFly中有walk方法,Horse中也有walk方法。那么AdapterFly会继承哪个方法呢?可能好多人纠结这个问题。
经测试两个都继承,就好像是把两个糅合成了一个。哈. 深入没有研究,如果有明白的同学,请留言科普一下,谢谢。
对象的适配器模式:
采用组合的方式实现,类适配器是采用继承的方式实现。看下面代码:
package com.pattern.struct.adapter.obj; import com.pattern.struct.adapter.cla.Horse; import com.pattern.struct.adapter.cla.HorseFly; public class AdapterFly implements HorseFly{ private Horse horse; public AdapterFly(Horse horse){ this.horse = horse; } @Override public void walk() { this.horse.walk(); } @Override public void fly() { System.out.println("I can fly..."); } }
采用组合的方式实现,类适配器是采用继承的方式实现.
接口的适配器模式:
package com.pattern.struct.adapter.inter; import com.pattern.struct.adapter.cla.HorseFly; public class AbstractHorse implements HorseFly{ @Override public void walk() { } @Override public void fly() { } }
package com.pattern.struct.adapter.inter; public class WalkHorse extends AbstractHorse{ @Override public void walk() { System.out.println("I can walk"); } }