属于结构型模式。适配器这三个字在生活中很常见。举个最简单的例子,那就是变压器,它可以把几万伏的高压变成我们生活用电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");
}
}