1. 介绍
1.1 定义
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不谦容的类可以合作无间。
1.2 模式角色
- Target(目标抽象类): 目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类
- Adaptee(适配者类): 适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码
- Adapter(适配器类): 适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系
1.3 模式分类
- 对象适配器模式:在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体
- 类适配器模式: 这种适配器模式下,适配器继承自已实现的类(一般多重继承)
- 缺省适配器模式: 一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法都是空方法。而具体的子类都要继承此抽象类
2. 对象适配器模式示例(组合实现)
2.1 类图
2.2 Demo
Target(目标抽象类):
package com.jbp.designpattern.adapter;
/**
* @ClassName: Duck
* @description: 鸭子类
* @author: JiangBeiPing
* @create: 2021-07-26 11:27
* @Version: 1.0
**/
public interface Duck {
// 嘎嘎叫
public void quack();
public void fly();
}
package com.jbp.designpattern.adapter;
/**
* @ClassName: MallardDuck
* @description: 绿头鸭子
* @author: JiangBeiPing
* @create: 2021-07-26 11:28
* @Version: 1.0
**/
public class MallardDuck implements Duck{
@Override
public void quack() {
System.out.println("嘎嘎叫...");
}
@Override
public void fly() {
System.out.println("飞行...");
}
}
Adaptee(适配者类):
package com.jbp.designpattern.adapter;
/**
* @ClassName: Turkey
* @description: 火鸡类接口
* @author: JiangBeiPing
* @create: 2021-07-26 11:22
* @Version: 1.0
**/
public interface Turkey {
// 咯咯叫
public void gobble();
// 飞行
public void fly();
}
package com.jbp.designpattern.adapter;
/**
* @ClassName: WildTurkey
* @description: 火鸡具体实现类
* @author: JiangBeiPing
* @create: 2021-07-26 11:23
* @Version: 1.0
**/
public class WildTurkey implements Turkey{
@Override
public void gobble() {
System.out.println("咯咯叫...");
}
@Override
public void fly() {
System.out.println("飞行...");
}
}
Adapter(适配器类):
package com.jbp.designpattern.adapter;
/**
* @ClassName: TurkeyAdapter
* @description: 适配器 :火鸡 ---> 鸭子
* @author: JiangBeiPing
* @create: 2021-07-26 11:25
* @Version: 1.0
**/
// 1.实现想转换成的类型接口,即客户端所期望看到的接口
public class TurkeyAdapter implements Duck {
Turkey turkey;
// 2.取得要适配的对象引用
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
// 3.实现接口中的方法
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
turkey.fly();
}
}
package com.jbp.designpattern.adapter;
/**
* @ClassName: test
* @description: 测试
* @author: JiangBeiPing
* @create: 2021-07-26 11:39
* @Version: 1.0
**/
public class test {
public static void main(String[] args) {
// 鸭子
MallardDuck mallardDuck = new MallardDuck();
// 火鸡
WildTurkey wildTurkey = new WildTurkey();
// 将火鸡包装进适配器中,使它看起来像个鸭子
TurkeyAdapter turkeyAdapter = new TurkeyAdapter(wildTurkey);
turkeyAdapter.quack();
turkeyAdapter.fly();
}
}
2.3 优缺点
优点:
- 使用方便,代码简化,只需要引入一个对象,并不需要额外的字段来引用Adaptee实例
缺点:
- 与类适配器模式相比,要在适配器中置换适配者类的某些方法比较麻烦
3. 类适配器模式(多重继承实现)
3.1 类图
3.2 优缺点
优点:
- 由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强
缺点:
- 需要多重继承实现,java不支持多重继承
- 类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性