前言
考虑一个问题。人会跑,鸟而会飞,如果我们跑步的时候起来,应该怎么办能,答案就是要具备鸟会飞的技能,适配器可以帮我们实现。
将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。
根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。
第一种 类适配器
代码如下:
public interface Bird {
public void fly();
}
/**
* 鸽子
*/
public class Pigeon implements Bird{
@Override
public void fly() {
System.out.println("飞起来了");
}
}
public interface Human {
public void run();
}
public class ChineseHuman extends Pigeon implements Human {
@Override
public void run() {
System.out.println("跑起来了");
fly();
}
}
public class Test {
public static void main(String[] args) {
Human human = new ChineseHuman(); // run中没有我们的想要的方法,通过类适配器,访问run 的时候,访问了想要的方法
human.run();
}
}
跑起来了
飞起来了
通过继续鸟的实现类鸽子,人类调用了鸟飞的技能。
第二种 对象适配器
考虑一个问题,如果要使用某个对象的一个方法,那用继承类显然无法实现,这个时候使用对象适配。
代码如下;
public class ChineseHuman implements Human {
private Bird bird;
public ChineseHuman(Bird bird) {
this.bird = bird;
}
@Override
public void run() {
System.out.println("跑起来了");
bird.fly();
}
}
其他的就不贴出来,只有这个不同,通过构造对象的时候,传入被适配对象,然后用调用被适配对象的方法,本例中是 bird.fly();
测试:
public class Test {
public static void main(String[] args) {
Human human = new ChineseHuman(new Pigeon()); // run中没有我们的想要的方法,通过类适配器,访问run 的时候,访问了想要的方法
human.run();
}
}
跑起来了
飞起来了
第三种 接口适配器
如果一种接口有很多方法,我们的实现类不想实现这么多,就用到了接口适配
接口
public interface Bird {
/**
* 飞
*/
public void fly();
/**
* 吃虫子
*/
public void eatWorm();
/**
* 下蛋
*/
public void createEgg();
}
抽象类实现接口
public abstract class BigBird implements Bird {
@Override
public void fly() {
}
@Override
public void eatWorm() {
}
@Override
public void createEgg() {
}
}
具体实现类
public class Pigeon extends BigBird {
@Override
public void fly() {
super.fly();
System.out.println("飞起来了");
}
}
这是我们需要的类,实现一个方法就行了。