All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
PHP学习宝典-第三章_[PHP教程]
发布一个最强的PHP通用分页类_[PHP教程]
高效SQL原则_[SQL,Server教程]
SQL中通配符、转义符与--[--号的使用(downmoon)_[SQL,Server教程]
PHP教程:学习掌握动态网页PHP的编程语句_[PHP教程]
简单的SQL语句摘记_[SQL,Server教程]
VS,2008,中文版,(90天评估)_[Asp.Net教程]
HTML 5 预览(1)_[Html教程]
delphi程序中动态创建、删除视图
PHP技巧:PHP脚本编程中的文件系统函数库_php资料_编程技术
Reading number is top 10 pictures
8090后结婚的各种XX事
有种屌丝级别的好妹子
LiXiang early youth photo
A beautiful girl to bud2
真正的国产-非模拍 贵在是真实1
恶搞漫画1
美女和狗狗1
NeedWallpaper10
Is said to be a Chinese female artist fame explicit pictures before1
So beauty, will let you spray blood6
Download software ranking
Professional killers2 for Android
Boxer's Top ten classic battle5
Wild things 2
Ashlynn Video2
虚拟机5.5.3版
Unix video tutorial20
Unix video tutorial3
C#高级编程(第4版)
linux初级教程
Unix video tutorial14
aaa published in(发表于) 2013/12/18 8:19:50 Edit(编辑)
无废话C#设计模式之七:Adapter_.net资料_编程技术

无废话C#设计模式之七:Adapter_.net资料_编程技术

无废话C#设计模式之七:Adapter_.net资料_编程技术-你的首页-uuhomepage.com

  本系列文章将向大家介绍一下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;
  }
  }
  }


  代码执行结果如下图:


无废话C#设计模式之七:Adapter


  代码说明


  可以看到,原先的接口中,启动游戏场景只需要一个参数,就是游戏场景名,而进入新的玩家需要提供玩家ID(新游戏都使用玩家ID而不使用玩家账户名)。


  IGame接口就是适配器模式中的目标角色,这是客户所期待的接口。也是针对老的游戏程序所遵循的接口。


  Lobby类相当于调用方或者客户,它原先的代码可能是如下的:


  Game game = new Game();


  但是由于接口的改变,现在不能直接实例化游戏类,只能实例化适配器类型。虽然还是需要改动,但是这个改动是很小的,而且完全可以通过用动态加载程序集来消除这种改动。


  GameAdapter类是适配器角色,它是适配器模式的核心,用于把源接口转变为目标接口。在这里,我们看到,它实现目标接口。


  Game类型是源角色,或者说是需要适配的对象。或许它也遵循了另外一套接口,不过我们不是很关心这个,因此代码中也没有体现。


  使用了适配器模式后,客户端代码没有做什么修改。客户端代码老老实实的依赖接口,它并没有错,如果因此依赖对象的修改而需要大幅度修改就很无辜了,我们在适配器中把本来没有关联的两个接口适配在了一起。我们可以看到,适配器做的不仅仅是换一换方法名,如果源角色和目标角色的差异非常大,那么适配器需要做很多工作。


  何时采用


  从代码角度来说, 如果需要调用的类所遵循的接口并不符合系统的要求或者说并不是客户所期望的,那么可以考虑使用适配器。


  从应用角度来说, 如果因为产品迁移、合作模块的变动,导致双方一致的接口产生了不一致,或者是希望在两个关联不大的类型之间建立一种关系的情况下可以考虑适配器模式。


  实现要点


  适配器模式是否能成功运用的关键在于代码本身是否是基于接口编程的,如果不是的话,那么适配器无能为力。


  适配器模式的实现很简单,基本的思想就是适配器一定是遵循目标接口的。


  适配器模式的变化比较多,可以通过继承和组合方式进行适配,适配器可以是一组适配器产品,适配器也可以是抽象类型。


  适配器模式和Facade的区别是,前者是遵循接口的,后者可以是不遵循接口的,比较灵活。


  适配器模式和Proxy的区别是,前者是为对象提供不同的接口,或者为对象提供相同接口,并且前者有一点后补的味道,后者是在设计时就会运用的。


  注意事项


  在对两个无关类进行适配的时候考虑一下适配的代价,一个非常庞大的适配器可能会对系统性能有影响。





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.