简介:【Java设计模式】接口型模式–Adapter(适配器)模式Adapter模式的宗旨就是:向客户提供接口,并使用现有的类所提供的服务,以满足客户的需求。 或者说,现在有classA的方法满足客户的部分要求,将另一部分需求抽象
【Java 设计模式】接口型模式–Adapter(适配器)模式Adapter模式的宗旨就是:向客户提供接口,并使用现有的类所提供的服务,以满足客户的需求。
或者说,现在有class A的方法满足客户的部分要求,将另一部分需求抽象为interface B,那么就要有Adapter来使得class A和interface B相互结合,满足客户全部需求。通俗的理解:在party上,我想去搭讪一个女生Jerry。但是我的英语很烂,于是我拿了个翻译器,翻译器就是我和Jerry之间的Adapter,让我和Jerry可以很好的交谈。一,类适配器
示例代码public interface RequiredInterface {/*** 这是客户需要的方法*/public void requireMethod();}123456public class ExistingClass {/*** 这是现有的方法*/public void usefulMethod(){}}1234567适配器角色Adapter扩展了ExistingClass ,同时又实现了RequiredInterface 接口。由于ExistingClass 没有提供requireMethod()方法,而RequiredInterface 又要求这个方法,因此适配器角色Adapter实现了这个方法。public class Adapter extends ExistingClass implements RequiredInterface {/*** 由于源类ExistingClass没有方法requireMethod()* 因此适配器补充上这个方法*/@Overridepublic void requireMethod() {//写相关的代码}}12345678910二,对象适配器
类适配器通过创建子类来实现适配,在设计类适配器的时候,新的适配器类可以实现期望的接口,并扩展已有的类。而对象适配器则是用委托的方式。
有两种方式,一种是实现接口的方式,一种是继承类的方式。
实现目标接口
示例代码public interface RequiredInterface {/*** 这是客户需要的方法*/public void requireMethod();}123456public class ExistingClass {/*** 这是现有的方法*/public void usefulMethod(){}}1234567public class Adapter implements RequiredInterface{private ExistingClass exist;public Adapter(ExistingClass exist){this.exist = exist;}/*** 源类ExistingClass有方法usefulMethod* 因此适配器类直接委派即可*/public void usefulMethod(){this.exist.usefulMethod();}/*** 由于源类ExistingClass没有方法requireMethod()* 因此适配器补充上这个方法*/@Overridepublic void requireMethod() {//写相关的代码}}12345678910111213141516171819202122继承目标类
示例代码public class RequiredClass {/*** 这是客户需要的方法*/public void requireMethod();}123456public class ExistingClass {/*** 这是现有的方法*/public void usefulMethod(){}}1234567public class Adapter extends RequiredClass {private ExistingClass exist;public Adapter(ExistingClass exist){this.exist = exist;}/*** 源类ExistingClass有方法usefulMethod* 因此适配器类直接委派即可*/public void usefulMethod(){this.exist.usefulMethod();}/*** 由于源类ExistingClass没有方法requireMethod()* 因此适配器补充上这个方法*/public void requireMethod() {//写相关的代码}}123456789101112131415161718192021三,接口的适配器模式
接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,
此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。
示例代码public interface RequiredInterface{public void requireMethod1();public void requireMethod2();} 12345public abstract class AbstractRequiredClass implements RequiredInterface{public void requireMethod1(){}public void requireMethod2(){}} 12345public class Adapter1 extends AbstractRequiredClass {public void requireMethod1(){System.out.println("the RequiredInterface interface's first requireMethod1!");}} 12345public class Adapter2 extends AbstractRequiredClass {public void requireMethod2(){System.out.println("the RequiredInterface interface's first requireMethod2!");}} 12345个人觉得适配器模式中的这三种模式是挺灵活的,比如:复用性,系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。还有扩展性在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
不过在使用适配器时,也要注意到除非对系统的架构很清楚,否则过多的使用适配器,会让系统非常零乱,不易整体进行把握。