Java设计模式--适配器模式

简介: 适配器模式(别名:包装类)将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。Adapter Pattern(Another Name: wrapper)Convert the interface of a class into another interface clients expect

适配器模式(别名:包装类)

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

Adapter Pattern(Another Name: wrapper)

Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interface.

类图

模式的结构与使用

由于Java不支持多重继承,即一个类只能有一个父类,所以本节给出适配器模式的类图按着GOF著作的分类属于对象适配器模式的类图,不是类适配器模式的类图。
对象适配器模式的结构中包括三个角色。
+ 目标(Target):目标是一个接口,该接口是客户想使用的接口。
+ 被适配者(Adaptee):被适配者是一个已经存在的接口或抽象类,这个接口或抽象类需要适配。
+ 适配器(Adapter):适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配器的职责是对被适配者接口或是抽象类于目标接口进行适配。

简单的例子

Target的抽象类ThreeElectricOutlet.java

package Adapter;

public interface ThreeElectricOutlet {
    public abstract void connectElectricCurrent();
}

Adaptee的接口类TwoElectriOutlet.java

package Adapter;

public interface TwoElectricOutlet {
    public abstract void connectElectricCurrent();
}

Adapter的实现类ThreeElectricAdapter.java

package Adapter;

public class ThreeElectricAdapter implements ThreeElectricOutlet {

    TwoElectricOutlet outlet;

    public ThreeElectricAdapter(TwoElectricOutlet outlet) {
        this.outlet = outlet;
    }

    @Override
    public void connectElectricCurrent() {
        outlet.connectElectricCurrent();
    }
}

测试类Application.java

package Adapter;

public class Application {

    public static void main(String[] args) {
        ThreeElectricOutlet outlet;
        Wash wash = new Wash();
        outlet = wash;
        System.out.println("使用三相插座接通电源:");
        outlet.connectElectricCurrent();
        TV tv = new TV();
        ThreeElectricAdapter adapter = new ThreeElectricAdapter(tv);
        outlet = adapter;
        System.out.println("使用三相插座接通电源:");
        outlet.connectElectricCurrent();
    }
}

class Wash implements ThreeElectricOutlet {
    String name;

    public Wash() {
        name = "黄河洗衣机";
    }

    public Wash(String s) {
        name = s;
    }

    @Override
    public void connectElectricCurrent() {
        turnOn();
    }

    private void turnOn() {
        System.out.println(name + "开始洗衣服");
    }
}

class TV implements TwoElectricOutlet {

    String name;

    public TV() {
        name = "长江电视机";
    }

    public TV(String s) {
        name = s;
    }

    @Override
    public void connectElectricCurrent() {
        turnOn();
    }

    private void turnOn() {
        System.out.println(name + "开始放节目");
    }   
}

适配器的适配程度

1.完全适配

如果目标(Target)接口中的方法数目与配适配者(Adaptee)接口的方法数目相等,那么适配器(Adapter)可将被适配者接口(抽象类)与目标接口进行完全适配。

2.不完全匹配

如果目标(Target)接口中的方法数目少于配适配者(Adaptee)接口的方法数目,那么适配器只能将被适配者接口与目标接口进行部分适配。

3.剩余适配

如果目标(Target)接口中的方法数目大于配适配者(Adaptee)接口的方法数目,那么适配器(Adapter)可将被适配者接口(抽象类)与目标接口进行完全适配,但必须将目标多余的方法给出用户允许的默认实现。

适配器模式的优点

  • 目标(Target)和被适配者(Adaptee)是完全解耦的关系。
  • 适配器模式满足“开-闭原则”。当添加一个实现Adaptee接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。

试用适配器模式的情景

  • 用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。
  • 用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。

下载源码请到

MyGitHub

目录
相关文章
|
12天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
23天前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
29 4
|
2月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
49 0
[Java]23种设计模式
|
28天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
2月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
3月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
3月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
3月前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
3月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
|
2月前
|
设计模式 Java
Java设计模式
Java设计模式
32 0