适配器模式通过定义一个适配器类作为两个不兼容的接口之间的桥梁,将一个类的接口转换成用户期望的另一个接口,使得两个或多个原本不兼容的接口可以基于适配器类一起工作。
适配器的实现主要分为三类:类适配器模式、对象适配器模式和接口适配器模式。
在不改变原来接口或类结构的情况下扩展类的功能以适配不同的接口时,可以使用类的适配器模式。
(1)定义Source类:
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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接口:
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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 class Main { public static void main(String[] args) { Targetable targetable = new Adapter(); targetable.editTextFile(); targetable.editWordFile(); } }
结果:
十二月 29, 2019 9:59:42 下午 com.jzq.sign.Adapter.Source editTextFile 信息: a text file editing 十二月 29, 2019 9:59:43 下午 com.jzq.sign.Adapter.Adapter editWordFile 信息: a word file editing
对象适配器模式的思路与类适配器模式基本相同,只是Adapter不再继承Source类,而是持有Source类的实例。
(1)定义Source类:
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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)适配器类定义:
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class ObjectAdapter 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"); } }
(4)使用类适配器:
public class Main { public static void main(String[] args) { Source source = new Source(); Targetable targetable = new ObjectAdapter(source); targetable.editTextFile(); targetable.editWordFile(); } }
结果:
十二月 30, 2019 10:45:08 上午 com.jzq.sign.Adapter.ObjectAdapter.Source editTextFile 信息: a text file editing 十二月 30, 2019 10:45:08 上午 com.jzq.sign.Adapter.ObjectAdapter.ObjectAdapter editWordFile 信息: a word file editing
在不希望实现一个接口中所有方法时,可以创建一个抽象类AbstractAdapter实现所有方法,在使用时继承该抽象类按需实现方法即可。
(1)定义公共接口Sourceable:
public interface Sourceable { void editTextFile(); void editWordFile(); }
(2)定义抽象类AbstractAdapter并实现公共接口方法:
public abstract class AbstractAdapter implements Sourceable { @Override public void editTextFile(){} @Override public void editWordFile(){} }
(3)定义SourceSub1类按照需求实现editTextFile方法:
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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)定义SourceSub2类按照需求实现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 class Main { public static void main(String[] args) { Sourceable source1 = new SourceSub1(); Sourceable source2 = new SourceSub2(); source1.editTextFile(); source2.editWordFile(); } }
结果:
十二月 30, 2019 11:01:04 上午 com.jzq.sign.Adapter.AbstractAdapter.SourceSub1 editTextFile 信息: a text file editing 十二月 30, 2019 11:01:04 上午 com.jzq.sign.Adapter.AbstractAdapter.SourceSub2 editWordFile 信息: a word file editing
原文:https://www.cnblogs.com/strong-FE/p/12116784.html