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

C# 設計模式實戰:Adapter 適配器模式完整解析(一)

     編輯:關於C語言

模式意圖

將一個類別的介面轉換成 Client 期望的另一介面,使原本介面不匹配的兩個類別能協同工作。

應用場景:遊戲大廳整合新遊戲

Client 端分大廳(道具、房間、啟動遊戲)與遊戲程式,不同公司開發,約定介面溝通。大廳開發近尾聲時,公司決定整合另一家遊戲,但新遊戲遵循不同介面。大廳與遊戲有 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 // Target
    {
        void StartScene(string sceneName);
        void EnterPlayer(string playerName);
    }

    class Lobby // Client
    {
        private string _sceneName;
        public void CreateRoom(string sceneName) => _sceneName = sceneName;
        public void StartGame()
        {
            IGame game = new GameAdapter(); // 改為 Adapter
            game.StartScene(_sceneName);
            game.EnterPlayer("yzhu");
        }
    }

    class Game // Adaptee
    {
        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 // Adapter
    {
        private Game _game = new Game();
        public void StartScene(string sceneName) => _game.LoadScene(sceneName, "Abcd1234");
        public void EnterPlayer(string playerName) => _game.EnterPlayer(GetPlayerIDByPlayerName(playerName));
        private int GetPlayerIDByPlayerName(string playerName) => 12345; // 模擬查詢
    }
}

關鍵設計決策

  • Client 代碼幾乎零修改(僅 new Game() → new GameAdapter())
  • 動態載入組件可進一步消除此處修改
  • Adapter 封裝所有介面差異:方法名、參數型別、額外必要參數
  • 組合模式(持有 Adaptee 實例)優於繼承模式,靈活度更高
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved