个人随笔
目录
六、结构型-适配器(Adapter)模式
2020-09-09 21:33:42

从这篇博文开始,我们将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源。

接下来,我们学习结构性、型模式的第一种模式:适配器模式。

一、适配器模式

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分三类:类的适配器模式、对象的适配器模式、接口的适配器模式。其实我觉得接口的适配器不是很符合适配器模式,但是也是很有用的,这里就加进来说明了。

二、类的适配器

核心思想是:有一个Source类,拥有一个方法,待适配,目标接口是Targetable,通过Adapter类,将Source的功能扩展到Targetable里。

1、UML

2、Source
  1. /**
  2. * 原来的类
  3. * @author suibibk.com
  4. *
  5. */
  6. public class Source {
  7. public void method1() {
  8. System.out.println("我是方法1");
  9. }
  10. }
3、Targetable
  1. /**
  2. * 目标接口
  3. * @author suibibk.com
  4. *
  5. */
  6. public interface Targetable {
  7. public void method1();
  8. public void method2();
  9. }
4、Adapter
  1. /**
  2. * 这样子,这个类不仅仅有Source方法1的能力,还有方法2的能力
  3. * @author suibibk.com
  4. *
  5. */
  6. public class Adapter extends Source implements Targetable {
  7. @Override
  8. public void method2() {
  9. System.out.println("我是方法2");
  10. }
  11. }
5、测试类Test
  1. public class Test {
  2. public static void main(String[] args) {
  3. Adapter adapter = new Adapter();
  4. adapter.method1();
  5. adapter.method2();
  6. }
  7. }

运行测试类,输出如下结果

  1. 我是方法1
  2. 我是方法2

这也就表明,我们扩展了原先的Source类,本来只有方法1 的功能的,现在也拥有了方法2的功能,并不影响使用。

二、对象适配器

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

1、UML

2、Source
  1. /**
  2. * 原来的类
  3. * @author suibibk.com
  4. *
  5. */
  6. public class Source {
  7. public void method1() {
  8. System.out.println("我是方法1");
  9. }
  10. }
3、Targetable
  1. /**
  2. * 目标接口
  3. * @author suibibk.com
  4. *
  5. */
  6. public interface Targetable {
  7. public void method1();
  8. public void method2();
  9. }
4、Adapter类
  1. /**
  2. * 这样子,这个类不仅仅有Source方法1的能力,还有方法2的能力
  3. * @author suibibk.com
  4. *
  5. */
  6. public class Adapter implements Targetable {
  7. private Source source;
  8. public Adapter(Source source){
  9. this.source =source;
  10. }
  11. @Override
  12. public void method2() {
  13. System.out.println("我是方法2");
  14. }
  15. @Override
  16. public void method1() {
  17. source.method1();
  18. }
  19. }

注意,这里没有用继承,用的是依赖。

5、测试类Test
  1. public class Test {
  2. public static void main(String[] args) {
  3. Adapter adapter = new Adapter(new Source());
  4. adapter.method1();
  5. adapter.method2();
  6. }
  7. }

输出结果当然跟上面是一样的

三、接口的适配器

第三种适配器模式是接口的适配器模式,接口的适配器模式是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这个明显是比较浪费的,因为并不是所有方法都是我们需要的,有时只需要某一些,此处为解决这个问题,我们引入礼物接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,之和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。

1、UML

2、Sourceable
  1. /**
  2. * 目标接口
  3. * @author suibibk.com
  4. *
  5. */
  6. public interface Sourceable {
  7. public void method1();
  8. public void method2();
  9. }

目标接口可能会有超级多的方法。

3、抽象类Wrapper
  1. public abstract class Wrapper implements Sourceable{
  2. @Override
  3. public void method1() {};
  4. @Override
  5. public void method2() {};
  6. }

对目标接口的所有方法进行假实现。

4、SourceSub1、SourceSub2
  1. /**
  2. * 实现方法1
  3. * @author suibibk.com
  4. *
  5. */
  6. public class SourceSub1 extends Wrapper{
  7. public void method1() {
  8. System.out.println("我是方法1");
  9. }
  10. }
  1. /**
  2. * 实现方法2
  3. * @author suibibk.com
  4. *
  5. */
  6. public class SourceSub2 extends Wrapper{
  7. public void method2() {
  8. System.out.println("我是方法2");
  9. }
  10. }

这样子就不需要实现所有方法了。

5、测试类Test
  1. public class Test {
  2. public static void main(String[] args) {
  3. SourceSub1 sourceSub1 = new SourceSub1();
  4. SourceSub2 sourceSub2 = new SourceSub2();
  5. sourceSub1.method1();
  6. sourceSub2.method2();
  7. }
  8. }

运行测试,结果当然是一样的。

总结

讲了这么多,总结一下三种适配器模式的应用场景:
类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Adapter类的方法中,调用实例的方法就行。
接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有的方法,我们写别的类的时候,继承抽象类即可。(我觉得这个可以不需要接口,也不太算属于适配器的模式)

 189

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2