适配器模式适合用来解决不同系统之间的对接问题。
适配器模式通过定义一个适配器类作为两个不兼容的接口之间的桥梁,将一个类的接口转换成用户期望的另一个接口,使得两个或多个原本不兼容的接口可以基于适配器类一起工作。
1. 类适配器模式
在不改变原有接口或类结构的情况下扩展类的功能以适配不同的接口时,可以使用类适配器模式。类适配器模式通过创建一个继承原有类(需要扩展的类)并实现新接口来实现。
(1)原类
public class Source{ private final static Log logger = LogFactory.getLog(Source.class); public void editTextFile(){ logger.info("a text file editing"); } }
(2)定义Targetable接口
public interface Targetable{ void editTextFile(); void editWordFile(); }
(3)定义Adapter继承Source并实现Targetable接口
public class Adapter extends Source implements Targetable{ private final static Log logger = LogFactory.getLog(Adapter.class); @Override public void editWordFile(){ logger.info("a word file editing"); } }
(4)使用类的适配器
public static void main(String[] args){ Targetable target = new Adapter(); target.editTextFile(); target.editWordFile(); }
2. 对象适配器
和类适配器思路基本相同,只是修改了Adapter类。
(1)适配器类定义
public class ObjectAdapter extends Source implements Targetable{ private final static Log logger = LogFactory.getLog(ObjectAdapter.class); private Source source; public ObjectAdapter(Source source){ super(); this.source = source; } @Override public void editTextFile(){ this.source.editTextFile(); } @Override public void editWordFile(){ logger.info("a word file editing"); } }
(2)使用对象适配器模式
Source source = new Source(); Targetable target = new ObjectAdapter(); target.editTextFile(); target.editWordFile();
3. 接口适配器模式
在不希望实现一个接口的所有方法时,可以创建一个抽象类实现所有方法,在使用时继承该抽象类按需实现方法即可。
(1)定义公共接口Sourceable
public class Sourceable{ void editTextFile(); void editWordFile(); }
(2)定义抽象类并实现公共接口
public abstract class AbstractAdapter implements Sourceable{ @Override public void editTextFile(){} @Override public void editWordFile(){} }
(3)实现需求editTextFile()
public class SourceSub1 extends AbstractAdapter{ private final static Log logger = LogFactory.getLog(SourceSub1.class); @Override public void editTextFile(){ logger.info("a text file editing"); } }
(4)实现需求editWordFile()
public class SourceSub2 extends AbstractAdapter{ private final static Log logger = LogFactory.getLog(SourceSub2.class); @Override public void editWordFile(){ logger.info("a word file editing"); } }
(5)使用接口适配器
public static void main(String[] args){ Sourceable source1 = new SourceSub1(); Sourceable source2 = new SourceSub2(); source1.editTextFile(); source2.editWordFile(); }