对于适配器模式,简单的一句话就是,它是一种将一个接口转成另一个接口的设计。
类图:
《Head First 设计模式》书中举的鸭子和火鸡的例子已经很好的介绍了(这书很好大家快去看),这里换一种说法来更简单的去理解,我也举一个简单的例子。
现在有两个接口,是胖子和瘦子:
public interface Fatty{
public void hitOtherPeople();//打人
public void dodge();//走位
}
public interface Thin{
public void beHit();//被打
public void dodge();
}
两个实现类,凯哥和我:
public static class RongKai implements Fatty{
@Override
public void hitOtherPeople() {
System.out.println("打别人");
}
@Override
public void dodge() {
System.out.println("走位风骚");
}
}
public static class Me implements Thin{
@Override
public void beHit() {
System.out.println("只能被打");
}
@Override
public void dodge() {
System.out.println("走位虚");
}
}
现在问题来了,现在要举办拳击比赛,需要一个胖子参赛,只能是胖子:
public static void boxing(Fatty fatty){
fatty.hitOtherPeople();
fatty.dodge();
}
但是凯哥现在去办别的大事去了,只有我个瘦子在,怎么办呢?打肿脸充胖子吧,把自己伪装成胖子去,这时候就需要一个适配器了:
public static class ThinAdapter implements Fatty{
private Thin thin;
public ThinAdapter(Thin thin){
this.thin = thin;
}
@Override
public void hitOtherPeople() {
thin.beHit();
}
@Override
public void dodge() {
thin.dodge();
}
}
注意这里的适配器实现了Fatty接口,也就是说它是一个Fatty,然后用了组合的方式,把一个Thin类型的对象传进来,具体的“打人”和“走位”就让thin对象来做了(可惜实际上只能被打)。
最后去参赛吧:
public static void main(String[] args) {
boxing(new ThinAdapter(new Me()));
}
结果是: