將一個類別的介面轉換成 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; // 模擬查詢
}
}
new Game() → new GameAdapter())