文章目录
  1. 1. 简单介绍
  2. 2. UML图
    1. 2.1. 参与者
  3. 3. 实例
  4. 4. 输出
  5. 5. 类模式和对象模式分析

简单介绍

将一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的类可以一起工作。该模式的目标是通过一个代理(这里是Adapter),在原来的类(Adaptee)和客户(Client)之间进行协调,从而达到兼容的目的。其核心是解决一致性的问题。

UML图

参与者

  1. Target:将目标接口封装角色。
  2. Adapter:适配之后的角色,实现Target接口
  3. Adaptee:需要被适配角色,其中包含的接口不符合客户端要求。

实例

Adapter可以分为类模式和对象模式两种,类模式通过多重继承实现,对象模式通过委托实现。
在Java中由于没有多重继承机制,所以要想实现类模式的Adapter,就要进行相应 的改变:通过继承Adaptee类实现Target接口方式实现。这种改变存在两个问题:

1)Target必须是一个接口而不能是一个类,否则 Adapter无法implements实现;
2)Adapter是继承Adaptee的实现,而不是私有继承,这就表示Adapter是一个 Adaptee的子类。

对象模式:

  1. Target:

    public interface Target {
        public void request();
    }
    
  2. Adapter:

    public class Adapter implements Target{
        private Adaptee adaptee;        
    
        public Adapter(Adaptee adaptee) {
            super();
            this.adaptee = adaptee;
        }
    
        @Override
        public void request() {
            System.out.println("start change interface");
            adaptee.specifricRequest();
            System.out.println("Down!");
        }
    
    }
    
  3. Adaptee:

    public class Adaptee {
        public void specifricRequest() {
            System.out.println("this is Adaptee's specifricRequest()!");
        }
    }
    
  4. Client:

    public class Client {
        public static void main(String arg[]) {
            Adaptee adaptee = new Adaptee();
            adaptee.specifricRequest();
    
            System.out.println("=====================");
            Target target = new Adapter(adaptee);
            target.request();
        }
    }
    

    类模式:

  5. Adapter2:

    public class Adapter1 extends Adaptee implements Target{
    
        @Override
        public void request() {
            this.specifricRequest();
        }
    
        public void addANewRequest() {
            System.out.println("this is a new request!");
        }
    
    }
    

输出

this is Adaptee's specifricRequest()!
=====================
start change interface
this is Adaptee's specifricRequest()!
Down!

类模式和对象模式分析

由于存在两种Adapter实现方式(即使在Java中),那么在实际中我们采用哪一种要好呢?通过分析发现这两种模式有两个主要特性区别,并且还是互补的:

  1. 表现在Adapter对Adaptee的特殊性要求:

    类模式由于Adapter是Adaptee的子类,所以Adapter很方便重新定义Adaptee中的个别方法,以达到自己的特性需要。

    对象模式由于Adapter不是Adaptee的子类,所以如果Adapter对Adaptee中的个别方法有特殊的需要,就要新建Adaptee的子类,而让Adapter使用这个子类。

  2. 表现在Adaptee的类层次扩展上:

    类模式由于Adapter是Adaptee的子类,所以编译后就不能再更换所实现的父类Adaptee,因此如果有一个Adaptee的类层次结构,就要相应的有一个Adapter的类层次结构,且新扩展Adaptee时很不方便。

    对象模式由于Adapter不是Adaptee的子类,而是通过使用的方式,所以在系统运行时仍然可以更换Adapter所使用的Adaptee,只要他们具有相同的类型。所以在新扩展Adaptee时很方便。

文章目录
  1. 1. 简单介绍
  2. 2. UML图
    1. 2.1. 参与者
  3. 3. 实例
  4. 4. 输出
  5. 5. 类模式和对象模式分析