一、简介
适配器模式(Adapter Pattern) 属于结构型模式中的一种,主的目的是兼容性,将某个类的接口转换成客户端期望的另一个接口表示,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。适配器分为两种:类适配器模式、对象适配器模式。
UML 图
Target: 目标接口。
Adapter:适配器实现目标接口。
Adaptee:被是适配器,所有的请求都委托给被适配者。
案例
1、 定义两个接口,与实现类
// 接口 public interface Duck { void duck(); void fly(); } // 实现类 public class ADuck implements Duck { @Override public void duck() { System.out.println("ga ga ga ga...."); } @Override public void fly() { System.out.println("fly"); } }
// 接口 public interface Turkey { void gobble(); void fly(); } // 实现类 public class ATurkey implements Turkey { @Override public void gobble() { System.out.println("gobble"); } @Override public void fly() { System.out.println("fly short"); } }
2、我们想将ADuck 类的接口,转换成客户期望的另一个接口。需要构建一个适配器
public class TurkeyAdapter implements Duck { Turkey turkey; public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } @Override public void duck() { turkey.gobble(); } @Override public void fly() { turkey.fly(); } }
3、 模拟一个客户端
public class ClientTest { static void testDuck(Duck duck){ duck.duck(); duck.fly(); } public static void main(String[] args) { ATurkey aTurkey = new ATurkey(); TurkeyAdapter adapter = new TurkeyAdapter(aTurkey); adapter.duck(); adapter.fly(); testDuck(new ADuck()); testDuck(adapter); } }
总结:
Adapter 模式最大的作用还是将原本不兼容的接口融合在一起工作。
三、类适配器模式
UML图
不同于对象适配器,类适配是通过多重继承来实现(Java不支持多继承)。
Client:客户认为他在和Target(鸭子)沟通;
Target:目标是鸭子类,是客户在其上调用方法的类;
Adaptee:火鸡类没有鸭子的方法,但是适配器可以对鸭子的方法进行调用,转接到调用火鸡的方法;