DOTA版设计模式——适配器模式
适配器,顾名思义是用来适配接口的,就拿我们常用的笔记本来说吧。大家都知道我们的笔记本在使用时都通过适配器连接电源,那是因为笔记本需要的电压和插座提供的电压不同,需要把插座提供的电压适配为笔记本可以接受的电压。
废话不多说,UML图是必上的:
适配器分为对象适配器和类适配器,由于类适配器需要用到多继承所以与C#无缘了,所以我们来研究下对象适配器。
本文中将要把野怪适配为英雄,假如说现在有个英雄的接口,什么呐?当然是说话了,接口如下所示:
/// <summary>
/// 适配接口
/// </summary>
public interface IHero
{
void Talk();
}
当当当当~,我们的英雄是“地域领主”,他肯定继承基类Hero,并且实现了IHero接口。
/// <summary>
/// 英雄
/// </summary>
public class Hero
{
protected string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
/// <summary>
/// 地域领主
/// </summary>
public class DK : Hero, IHero
{
public DK()
{
_name = "DK";
}
public void Talk()
{
LandpyForm.Form.OutputResult("For the Lich King");
}
}
我们可爱的DK在说些什么那:)
他在喊着我们熟悉的那句台词"For the Lich King"(为了巫妖王),太感动了,鼻涕都出来了。说到鼻涕又让我想起了我用的最好的英雄——无敌刚被。
下面轮到我们的二号男主角上场了,那就是传说中的"人马"大哥,他是野怪当然不会说话了,只会像野兽一样咆哮,Hmmm~~~~~~:
/// <summary>
/// 野怪
/// </summary>
public interface IBotWildNPC
{
void Howling();
}
/// <summary>
/// 人马
/// </summary>
public class Centaur : IBotWildNPC
{
public void Howling()
{
LandpyForm.Form.OutputResult("Mmmm.");
}
}
两大男主角介绍完毕,现在该导演出马了,有请适配器先生...........
本来我想实现把男人适配成女人来着,但是有点违背Dota这个题目,又怕不了解泰国风俗的兄弟理解不了,所以就把野怪适配为英雄了。适配器实现起来很简单,它继承要适配的那个功能接口,在构造函数时把要适配的对象传入,将传入的对象实现成需要的形式就可以了。代码如下:
public class HeroAdapter : IHero
{
private IBotWildNPC botWildNPC;
public HeroAdapter(IBotWildNPC botWildNPC)
{
this.botWildNPC = botWildNPC;
}
#region IHeroAdapter 成员
public void Talk()
{
this.botWildNPC.Howling();
}
#endregion
}
这样,经过适配后的野怪就会说话了耶。可以用下面的代码进行测试:
DotaPatternLibrary.Adapter.IHero hero = new DotaPatternLibrary.Adapter.DK();
hero.Talk();
DotaPatternLibrary.Adapter.IBotWildNPC botWildNPC = new DotaPatternLibrary.Adapter.Centaur();
botWildNPC.Howling();
hero = new DotaPatternLibrary.Adapter.HeroAdapter(botWildNPC);
hero.Talk();
可以看到new DotaPatternLibrary.Adapter.HeroAdapter(botWildNPC)适配后,新的对象有了Talk方法啦。野怪说话了,呵呵~~~~
输出以下结果:
For the Lich King
Mmmm......
Mmmm......
完整代码如下:
废话不多说,UML图是必上的:
适配器分为对象适配器和类适配器,由于类适配器需要用到多继承所以与C#无缘了,所以我们来研究下对象适配器。
本文中将要把野怪适配为英雄,假如说现在有个英雄的接口,什么呐?当然是说话了,接口如下所示:
/// <summary>
/// 适配接口
/// </summary>
public interface IHero
{
void Talk();
}
当当当当~,我们的英雄是“地域领主”,他肯定继承基类Hero,并且实现了IHero接口。
/// <summary>
/// 英雄
/// </summary>
public class Hero
{
protected string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
/// <summary>
/// 地域领主
/// </summary>
public class DK : Hero, IHero
{
public DK()
{
_name = "DK";
}
public void Talk()
{
LandpyForm.Form.OutputResult("For the Lich King");
}
}
我们可爱的DK在说些什么那:)
他在喊着我们熟悉的那句台词"For the Lich King"(为了巫妖王),太感动了,鼻涕都出来了。说到鼻涕又让我想起了我用的最好的英雄——无敌刚被。
下面轮到我们的二号男主角上场了,那就是传说中的"人马"大哥,他是野怪当然不会说话了,只会像野兽一样咆哮,Hmmm~~~~~~:
/// <summary>
/// 野怪
/// </summary>
public interface IBotWildNPC
{
void Howling();
}
/// <summary>
/// 人马
/// </summary>
public class Centaur : IBotWildNPC
{
public void Howling()
{
LandpyForm.Form.OutputResult("Mmmm.");
}
}
两大男主角介绍完毕,现在该导演出马了,有请适配器先生...........
本来我想实现把男人适配成女人来着,但是有点违背Dota这个题目,又怕不了解泰国风俗的兄弟理解不了,所以就把野怪适配为英雄了。适配器实现起来很简单,它继承要适配的那个功能接口,在构造函数时把要适配的对象传入,将传入的对象实现成需要的形式就可以了。代码如下:
public class HeroAdapter : IHero
{
private IBotWildNPC botWildNPC;
public HeroAdapter(IBotWildNPC botWildNPC)
{
this.botWildNPC = botWildNPC;
}
#region IHeroAdapter 成员
public void Talk()
{
this.botWildNPC.Howling();
}
#endregion
}
这样,经过适配后的野怪就会说话了耶。可以用下面的代码进行测试:
DotaPatternLibrary.Adapter.IHero hero = new DotaPatternLibrary.Adapter.DK();
hero.Talk();
DotaPatternLibrary.Adapter.IBotWildNPC botWildNPC = new DotaPatternLibrary.Adapter.Centaur();
botWildNPC.Howling();
hero = new DotaPatternLibrary.Adapter.HeroAdapter(botWildNPC);
hero.Talk();
可以看到new DotaPatternLibrary.Adapter.HeroAdapter(botWildNPC)适配后,新的对象有了Talk方法啦。野怪说话了,呵呵~~~~
输出以下结果:
For the Lich King
Mmmm......
Mmmm......
完整代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DotaCommon;
namespace DotaPatternLibrary.Adapter
{
/// <summary>
/// 英雄
/// </summary>
public class Hero
{
protected string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
/// <summary>
/// 适配接口
/// </summary>
public interface IHero
{
void Talk();
}
/// <summary>
/// 地域领主
/// </summary>
public class DK : Hero, IHero
{
public DK()
{
_name = "DK";
}
public void Talk()
{
LandpyForm.Form.OutputResult("For the Lich King");
}
}
/// <summary>
/// 野怪
/// </summary>
public interface IBotWildNPC
{
void Howling();
}
/// <summary>
/// 人马
/// </summary>
public class Centaur : IBotWildNPC
{
public void Howling()
{
LandpyForm.Form.OutputResult("Mmmm.");
}
}
public class HeroAdapter : IHero
{
private IBotWildNPC botWildNPC;
public HeroAdapter(IBotWildNPC botWildNPC)
{
this.botWildNPC = botWildNPC;
}
#region IHeroAdapter 成员
public void Talk()
{
this.botWildNPC.Howling();
}
#endregion
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DotaCommon;
namespace DotaPatternLibrary.Adapter
{
/// <summary>
/// 英雄
/// </summary>
public class Hero
{
protected string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
/// <summary>
/// 适配接口
/// </summary>
public interface IHero
{
void Talk();
}
/// <summary>
/// 地域领主
/// </summary>
public class DK : Hero, IHero
{
public DK()
{
_name = "DK";
}
public void Talk()
{
LandpyForm.Form.OutputResult("For the Lich King");
}
}
/// <summary>
/// 野怪
/// </summary>
public interface IBotWildNPC
{
void Howling();
}
/// <summary>
/// 人马
/// </summary>
public class Centaur : IBotWildNPC
{
public void Howling()
{
LandpyForm.Form.OutputResult("Mmmm.");
}
}
public class HeroAdapter : IHero
{
private IBotWildNPC botWildNPC;
public HeroAdapter(IBotWildNPC botWildNPC)
{
this.botWildNPC = botWildNPC;
}
#region IHeroAdapter 成员
public void Talk()
{
this.botWildNPC.Howling();
}
#endregion
}
}