適配器模式的應用實例

一、適配器模式的概述

適配器模式是一種將一個類的介面轉換成客戶期望的另一個介面的設計模式,旨在解決原介面與目標介面之間不兼容的問題。

適配器模式分為類適配器模式和對象適配器模式,類適配器模式使用繼承關係來實現,而對象適配器模式使用組合關係來實現。

二、適配器模式的應用實例類圖

下面是適配器模式的應用實例的類圖:

┌──────────┐                  ┌───────────────┐
│  Target  │◄─────────────── │  Adapter      │
└──────────┘                  ├─ adaptee      │
                               ├─ request()    │
                               └───────────────┘

┌───────────────┐
│  Adaptee      │
└───────────────┘

三、適配器模式的應用實例有哪些

適配器模式在實際項目中有很多應用,以下是幾個常見的應用實例:

四、適配器模式的例子

以美國插頭和中國插座為例,插頭不兼容是一個典型的適配器模式應用實例。美國的插頭是二平行插腳的,而中國的插座是二楔形插孔的,它們不兼容。所以需要一個適配器來做橋樑,將美國插頭轉換為中國插座可以接收的形式。

下面是適配器模式的應用實例的代碼:

// 客戶端代碼
public class Client {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request();
    }
}

// 目標介面
public interface Target {
    void request();
}

// 適配器
public class Adapter implements Target {
    private Adaptee adaptee = new Adaptee();

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 源類
public class Adaptee {
    public void specificRequest() {
        System.out.println("美國插頭");
    }
}

五、工廠方法模式的應用實例

一個系統中可能存在多個播放器,每個播放器支持播放不同的音頻格式,為了滿足客戶端需要,需要把所有的播放器統一到一個介面中去。這時可以採用適配器模式來解決問題。

下面是適配器模式的應用實例的代碼:

// 客戶端代碼
public class Client {
    public static void main(String[] args) {
        MediaPlayer player;

        player = new AudioPlayer();
        player.play("mp3", "Beyond the horizon.mp3");

        player = new MediaAdapter("mp4");
        player.play("mp4", "alone.mp4");

        player = new MediaAdapter("vlc");
        player.play("vlc", "far far away.vlc");
    }
}

// 目標介面
public interface MediaPlayer {
    public void play(String audioType, String fileName);
}

// 源類
public interface AdvancedMediaPlayer {
    public void playVlc(String fileName);

    public void playMp4(String fileName);
}

// 播放器類
public class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
        // 播放 mp3 音樂文件的內置支持
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: " + fileName);
        }

        // mediaAdapter 提供了播放其他文件格式的支持
        else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        }

        else {
            System.out.println("Invalid media. " + audioType + " format not supported");
        }
    }
}

// 適配器類
public class MediaAdapter implements MediaPlayer {

    AdvancedMediaPlayer advancedMusicPlayer;

    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {

        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer.playVlc(fileName);
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer.playMp4(fileName);
        }
    }
}

// 源類
public class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {}

    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}

// 源類
public class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {}
}

六、適配器模式應用場景

適配器模式可以用在以下場景中:

  • 系統需要使用一些現有的類,而這些類的介面不符合系統的需求。
  • 想要創建一個可以重用的類,他的介面與其它不相關或不可預見的類的介面協作。
  • 需要將一些類的介面轉換為客戶端期望的介面。

七、對象適配器模式的典型應用

使用對象適配器模式將一個類的介面轉換成客戶希望的另一個介面,這種情況下我們可以使用對象適配器模式。

下面是對象適配器模式的應用實例的代碼:

// 目標介面
public interface Target {
    void request();
}

// 源類
public class Adaptee {
    public void specificRequest() {
        System.out.println("美國插頭");
    }
}

// 適配器
public class ObjectAdapter implements Target {
    private Adaptee adaptee;

    public ObjectAdapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 客戶端代碼
public class Client {
    public static void main(String[] args) {
        Target target = new ObjectAdapter(new Adaptee());
        target.request();
    }
}

八、適配器模式經典例子

適配器模式的經典例子是JAVA集合框架中的 Enumeration介面,該介面提供了一種讀取一組數據的方式,但是它的方法與 Iterator的方法不同,由於 Iterator更加靈活和易用,於是可以使用適配器模式來將 Enumeration適配成 Iterator介面。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/296022.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-27 12:57
下一篇 2024-12-27 12:57

相關推薦

  • SSVMW介紹及應用實例解析

    SSVMW是輕量級高性能的Web框架,能夠快速地提高Web應用程序的安全性、性能和可靠性。下面我們將從多個方面對SSVMW進行詳細的闡述,介紹如何使用它來構建Web應用程序。 一、…

    編程 2025-04-29
  • Python動態輸入: 從基礎使用到應用實例

    Python是一種高級編程語言,因其簡單易學和可讀性而備受歡迎。Python允許程序員通過標準輸入或命令行獲得用戶輸入,這使得Python語言無法預測或控制輸入。在本文中,我們將詳…

    編程 2025-04-28
  • 手機安全模式怎麼解除?

    安全模式是一種手機自身的保護模式,它會禁用第三方應用程序並使用僅限基本系統功能。但有時候,安全模式會使你無法使用手機上的一些重要功能。如果你想解除手機安全模式,可以嘗試以下方法: …

    編程 2025-04-28
  • Qt State Machine與狀態機模式

    本文將介紹Qt State Machine和狀態機模式在Qt中的實現。Qt提供了QStateMachine和QState兩個類,可以方便地實現狀態機模式,並且能有效地處理複雜的、多…

    編程 2025-04-27
  • 顯示C++設計模式

    本文將詳細介紹顯示C++設計模式的概念、類型、優點和代碼實現。 一、概念 C++設計模式是在軟體設計階段定義,用於處理常見問題的可重用解決方案。這些解決方案是經過測試和驗證的,並已…

    編程 2025-04-27
  • Python 自建AI模型應用實例

    本文將介紹如何使用Python自建AI模型,以及如何應用到實際場景中。包括構建深度神經網路、訓練模型、預測數據、可視化結果等方面。 一、深度神經網路構建 深度神經網路是AI模型的核…

    編程 2025-04-27
  • Centos7進入單用戶模式的解釋

    本文將介紹如何在Centos7中進入單用戶模式,並從以下幾個方面進行詳細的闡述。 一、Centos7進入單用戶模式的解答 在Centos7中進入單用戶模式需要執行以下步驟: 1. …

    編程 2025-04-27
  • 深入解析PSM模式

    一、PSM模式是什麼 PSM模式,即頁面-狀態-模型模式,是一種前端開發模式。它以頁面為中心,將頁面內的所有狀態和業務邏輯抽象成一個由頁面轉化而來的虛擬狀態機模型,從而將業務邏輯與…

    編程 2025-04-25
  • 授權碼模式與OAuth2.0

    一、什麼是授權碼模式 授權碼模式(Authorization Code Grant Type)是OAuth2.0協議中最常用的授權方式之一,也是最為安全的一種授權方式。授權碼模式的…

    編程 2025-04-24
  • 暗黑模式的盛行

    一、背景和定義 暗黑模式起源於智能手錶和夜視儀等專業設備上的配色方案,是指採用黑底白字、暗灰底白字等相對較暗的背景色搭配亮色前景,以減少屏幕對用戶眼睛的刺激,降低視覺疲勞感。這種設…

    編程 2025-04-24

發表回復

登錄後才能評論