將一個類介面轉換為客戶端期望的另一介面,使原本介面不匹配的兩個類能協同工作。
網遊客戶端分大廳與遊戲程序,不同公司開發。大廳透過約定介面調用遊戲啟動場景。大廳開發近尾聲,公司決定接入新遊戲,但新遊戲遵循另一套介面。若大廳與遊戲有 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;
}
}
IGame game = new Game(),現改實例化 Adapter。改動極小,可配合動態載入組件消除編譯依賴。Game 並轉換參數/呼叫方式。