扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
意图
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。
场景
假设网络游戏的客户端
一开始的设计就是,大厅程序是基于接口方式调用游戏程序启动游戏场景方法的。在大厅程序开发接近完成的时候,公司决定和另外一家游戏公司合作,因此希望把大厅程序能适用另一个游戏。而这个新游戏的遵循的是另一套接口。是不是可以避免修改原先调用方法来启动场景呢?或许你会说,既然只有一个方法修改,那么修改一下也无妨,我们假设大厅程序和游戏程序之间有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; } } } |
代码执行结果如下图:
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者