Java 常用设计模式-适配器模式adapter

来源:互联网 发布:深圳雅思培训机构 知乎 编辑:程序博客网 时间:2024/05/21 18:48

本篇文章我们讲解适配器模式 adapter

顾名思义:适配器 -适配一词表明了已经存在了两个 类型 typeA和typeB  ,但是此时他们是不相容的,必须通过一个 东西去 过度  一下,从而让他们 达到相容的一步,那么这个东西 就是我们 说的 适配器


适配器 可以分为三种:类的适配,对象的适配,接口的适配  接下来我们 一个一个接着来说


第一:类的适配


核心思想就是:有一个Source( typeA)类,拥有一个方法,待适配
目标接口时Targetable(typeB  ),通过Adapter类,将Source的功能扩展到Targetable里,看代码:

源头类型(typeA)

package com.desionmodel.structure.adapter.classadapter;/** * 适配器模式是各种模式的起源 *  * 过度作用 将源(source)---->目标(target) * 之间加一个 匹配过程 * @author Administrator * */public class Source { public void method1() {          System.out.println("this is original method!");      }  }
目标接口

package com.desionmodel.structure.adapter.classadapter;public interface Targetable {/* 与原类中的方法相同 */      public void method1();        /* 新类的方法 */      public void method2();  }


使用适配器把源头类中的方法一(method1) 适配到 目标接口中,此时 我们可以想到 extends 即集成 源头类 这样就可以 获到父类的方法,那么 最终 想要变成 目标类的 类型要使用什么方法呢?

我们知道Java 是单继承的 ,所以要排除继承去变形-那么要 转型的话 就剩下 implement 实现 这条路了,即

package com.desionmodel.structure.adapter.classadapter;public class Adapter extends Source implements Targetable{@Overridepublic void method2() {System.out.println("this is the targetable method!");  }}

测试 一下:

package com.desionmodel.structure.adapter.classadapter;public class AdapterTest {public static void main(String[] args) {          Targetable target = new Adapter();          target.method1();          target.method2();      }  /** * 这样Targetable接口的实现类就具有了Source类的功能。 */}

上面说到了 类的适配,接下来我们说第二种 对象的适配

第二: 对象的适配


基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承Source类,
而是持有Source类的实例,以达到解决兼容性的问题

其他的类不变,只改变适配类---- 在此我们命名为 包装类 wrapper


package com.desionmodel.structure.adapter.objectadapter;import com.desionmodel.structure.adapter.classadapter.Source;import com.desionmodel.structure.adapter.classadapter.Targetable;/** * wrapper :包装 * @author Administrator * */public class Wrapper implements Targetable{ private Source source;           public Wrapper(Source source){          super();          this.source = source;      }      @Override      public void method2() {          System.out.println("this is the targetable method!");      }        @Override      public void method1() {          source.method1();      }  }


这种 获取 源头类的方式 叫做 组合,很多mvc架构中 多此引用,比如:control层中 引用 service 层中的 方式 就是 组合。


测试 一下:

package com.desionmodel.structure.adapter.objectadapter;import com.desionmodel.structure.adapter.classadapter.Source;import com.desionmodel.structure.adapter.classadapter.Targetable;public class AdapterTest {public static void main(String[] args) {          Source source = new Source();          Targetable target = new Wrapper(source);          target.method1();          target.method2();      }  }

第三:接口的适配

接口的适配其实 用的也挺多的,比如 接口中的方法较多,而一类 只想要部分功能-要是实现此接口的话,务必要实现此接口中所有的 方法,那么这样就有一点不合理了,显得有点多余,所以 就有了 接口的适配  达到 过滤的效果  即 只要我想要的方法

代码如下:

package com.desionmodel.structure.adapter.interfaceadaper;public interface Sourceable {/* 与原类中的方法相同 */      public void method1();        /* 新类的方法 */      public void method2();  }

package com.desionmodel.structure.adapter.interfaceadaper;public abstract class Wrapper2  implements Sourceable {// 此方法 子类不必实现 public void method1(){}     }


package com.desionmodel.structure.adapter.interfaceadaper;public class SourceSub1 extends Wrapper2{@Overridepublic void method2() {System.out.println("method2");}}


以上就是适配器的内容,适配器特别重要 是 结构型设计模式的 起源,在其他结构型 设计模式 中 都可以看到(对象) 适配器的影子。
0 0