51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Java 设计模式之适配器模式(六)

一、前言 {#一、前言}

在上篇 《Java 设计模式之原型模式(五)》 ,已经将设计模式中的创建型模式介绍完毕。

今天开始介绍设计模式中的结构性模式,本篇主题是适配器模式。

二、简单介绍 {#二、简单介绍}

2.1 定义 {#2.1-定义}

适配器模式可以改变已有类的接口形式,即使得原本由于接口不兼容而不能工作的类可以一起工作。

2.2 参与角色 {#2.2-参与角色}

  1. 目标接口(Target):客户所期望的接口。

  2. 适配类(Adaptee):需要适配的类。

  3. 适配器(Adapter):通过包装一个需要适配的对象,把原接口转成目标接口。

2.3 应用场景 {#2.3-应用场景}

  1. 想使用一个已经存在的类,而它的接口不符合当前的需求。

  2. 想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

三、实现方式 {#三、实现方式}

通过定义一个新的接口(Target)和一个实现该接口的类(Adapter)来透明地调用外部组件(Adaptee)。

我们以插座和插头为例,现有一个 3 脚插座和 一个 2 脚插头,我们需要一个插头转换器进行适配。

3 脚插座(目标接口):

|-----------------|-------------------------------------------------------------| | 1 2 3 4 | public interface Receptacle { public void func(); } |

2 脚插头(适配类):

|---------------------|------------------------------------------------------------------------| | 1 2 3 4 5 6 | public class Plug { public String intro() { return "2脚插头"; } } |

插头转换器(适配器):

需要实现目标接口和关联适配类。

|------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class PlugAdapter implements Receptacle { private Plug plug; public PlugAdapter(Plug plug) { this.plug = plug; } @Override public void func() { System.out.println("3脚插座适配" + this.plug.intro()); } } |

func 方法中调用 plug 对象的方法,即透明地调用外部组件。

客户端:

|-----------------------|------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 | public class Client { public static void main(String[] args) { Receptacle rp = new PlugAdapter(new Plug()); rp.func(); } } |

打印结果:

|-----------|--------------------| | 1 | 3脚插座适配2脚插头 |

还有一种方式实现适配器模式:让 PlugAdapter 类继承 Plug 从而获取其方法进行调用。但是,Java 中的类只支持单继承,使用继承限制代码的灵活性,不利于代码后期的扩展,因此不推荐使用该方式

UML 类图表示如下:

赞(0)
未经允许不得转载:工具盒子 » Java 设计模式之适配器模式(六)