程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 無廢話C#設計模式之七:Adapter(1)

無廢話C#設計模式之七:Adapter(1)

編輯:關於C語言

意圖

把一個類的接口變換成客戶端所期待的另一種接口,從而使原本接口不匹配而無法在一起工作的兩個類能夠在一起工作。

場景

假設網絡游戲的客戶端程序分兩部分。一部分是和服務端通訊的大廳部分,大廳部分提供的功能有道具購買、讀取房間列表、創建房間以及啟動游戲程序。另一部分就是游戲程序了,游戲程序和大廳程序雖然屬於一個客戶端,但是由不同的公司在進行開發。游戲大廳通過實現約定的接口和游戲程序進行通訊。

一開始的設計就是,大廳程序是基於接口方式調用游戲程序啟動游戲場景方法的。在大廳程序開發接近完成的時候,公司決定和另外一家游戲公司合作,因此希望把大廳程序能適用另一個游戲。而這個新游戲的遵循的是另一套接口。是不是可以避免修改原先調用方法來啟動場景呢?或許你會說,既然只有一個方法修改,那麼修改一下也無妨,我們假設大廳程序和游戲程序之間有100個接口,其中的大部分都有修改呢?因為游戲程序接口的修改,大廳程序可能要修改不止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

    {

        private 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

    {

        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)

        {

            return 12345;

        }

    }

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved