首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 設計模式無廢話系列(七):Adapter 適配器模式

     編輯:關於C#

意圖

將一個類介面轉換為客戶端期望的另一介面,使原本介面不匹配的兩個類能協同工作。

適用場景

網遊客戶端分大廳與遊戲程序,不同公司開發。大廳透過約定介面調用遊戲啟動場景。大廳開發近尾聲,公司決定接入新遊戲,但新遊戲遵循另一套介面。若大廳與遊戲有 100 個介面皆變,大廳需改上百處。引入 Adapter 適配介面不匹配。

完整範例程式碼

using System;
using System.Collections.Generic;
using System.Text;

namespace AdapterExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Lobby lobby = new Lobby();
            lobby.CreateRoom("HalfPaper");
            lobby.StartGame();
        }
    }
    interface IGame
    {
        void StartScene(string sceneName);
        void EnterPlayer(string playerName);
    }
    class Lobby
    {
        string sceneName;
        public void CreateRoom(string sceneName) => this.sceneName = sceneName;
        public void StartGame()
        {
            IGame game = new GameAdapter();
            game.StartScene(sceneName);
            game.EnterPlayer("yzhu");
        }
    }
    class Game
    {
        public void LoadScene(string sceneName, string token)
        {
            if (token == "Abcd1234") Console.WriteLine($"Loading {sceneName}...");
            else Console.WriteLine("Invalid token!");
        }
        public void EnterPlayer(int playerID) => Console.WriteLine($"player:{playerID} entered");
    }
    class GameAdapter : IGame
    {
        Game game = new Game();
        public void StartScene(string sceneName) => game.LoadScene(sceneName, "Abcd1234");
        public void EnterPlayer(string playerName) => game.EnterPlayer(GetPlayerIDByPlayerName(playerName));
        int GetPlayerIDByPlayerName(string name) => 12345;
    }
}

程式碼執行結果

Adapter 模式執行結果

程式碼解析

  • 原介面:啟動場景需場景名;進玩家需玩家 ID。新介面:啟動場景需場景名+Token;進玩家需玩家名。
  • IGame:目標角色(客戶期望介面),舊遊戲遵循此介面。
  • Lobby:客戶/調用方。原代碼 IGame game = new Game(),現改實例化 Adapter。改動極小,可配合動態載入組件消除編譯依賴。
  • GameAdapter:適配器核心,實現目標介面,內部持有源對象 Game 並轉換參數/呼叫方式。
  • Game:源角色(被適配對象)。
  • 客戶端代碼幾乎無修改:依賴介面無錯,適配器將無關介面銜接。適配器不只是改方法名,源目標差異大時需做大量轉換工作。

何時採用

  • 代碼角度:需調用類介面不符系統要求或客戶期望 → 考慮適配器。
  • 應用角度:產品遷移、合作模組變動導致介面不一致,或需在關聯度低的類間建立關係。

實作要點

  • 關鍵在於代碼是否基於介面編程,否則適配器無能為力。
  • 核心思想:適配器必須遵循目標介面。
  • 變化多:繼承/組合適配、適配器產品族、抽象適配器。
  • Adapter vs Facade:前者遵循介面,後者可不遵循,較靈活。
  • Adapter vs Proxy:前者提供不同介面或相同介面,帶後補性質;後者設計階段即引入。

注意事項

  • 適配無關類時評估代價,龐大適配器可能影響效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved