DOTA版设计模式——桥接
桥接模式比较简单,主要是运用了组合。
UML图:
本文中我虚构了一些场景,大概在Dota中不常发生吧。
Dota中有5个队友,假如,我说的是假如,你的队友西瓜吃多了想要去嘘嘘,但是现在是关键,他是团控,又不能为了胜利牺牲一条内裤加裤子吧。那我们只能共享单位了,现在你可以控制自己也可以控制去嘘嘘的队友的英雄。点击哪个英雄就控制哪个,在这里就可以用到桥接了。
上边说到桥接是组合,首先英雄是不能缺少的,除非已经被对方送回泉水,还没有重生,呵呵.......英雄来啦:
public interface IHero
{
void Action();
}
/// <summary>
/// 灵魂守卫
/// </summary>
public class Terrorblade : IHero
{
public Terrorblade()
{
}
#region IHero 成员
public void Action()
{
LandpyForm.Form.OutputResult("Terrorblade Action");
}
#endregion
}
/// <summary>
/// 德鲁伊
/// </summary>
public class Syllabear : IHero
{
public Syllabear()
{
}
#region IHero 成员
public void Action()
{
LandpyForm.Form.OutputResult("Syllabear Action");
}
#endregion
}
还差什么那,当然是我们玩家啦,没有玩家的游戏还叫游戏吗?
public class Gamer
{
private IHero _hero;
public IHero Hero
{
set { _hero = value; }
}
public void Action()
{
_hero.Action();
}
}
Gamer类中包含了IHero接口,依赖倒置嘛,不管有什么新英雄,Gamer的代码不用改动了,解耦绝对的解耦,HeadFirst所说"多用组合少用继承"啦。
测试代码如下:
DotaPatternLibrary.Bridge.Gamer gamer = new DotaPatternLibrary.Bridge.Gamer();
DotaPatternLibrary.Bridge.IHero hero = new DotaPatternLibrary.Bridge.Syllabear();
gamer.Hero = hero;
gamer.Action();
hero = new DotaPatternLibrary.Bridge.Terrorblade();
gamer.Hero = hero;
gamer.Action();
看吧,可以控制的英雄可以随时切换了吧,让队友快去嘘嘘吧。
完整代码:
UML图:
本文中我虚构了一些场景,大概在Dota中不常发生吧。
Dota中有5个队友,假如,我说的是假如,你的队友西瓜吃多了想要去嘘嘘,但是现在是关键,他是团控,又不能为了胜利牺牲一条内裤加裤子吧。那我们只能共享单位了,现在你可以控制自己也可以控制去嘘嘘的队友的英雄。点击哪个英雄就控制哪个,在这里就可以用到桥接了。
上边说到桥接是组合,首先英雄是不能缺少的,除非已经被对方送回泉水,还没有重生,呵呵.......英雄来啦:
public interface IHero
{
void Action();
}
/// <summary>
/// 灵魂守卫
/// </summary>
public class Terrorblade : IHero
{
public Terrorblade()
{
}
#region IHero 成员
public void Action()
{
LandpyForm.Form.OutputResult("Terrorblade Action");
}
#endregion
}
/// <summary>
/// 德鲁伊
/// </summary>
public class Syllabear : IHero
{
public Syllabear()
{
}
#region IHero 成员
public void Action()
{
LandpyForm.Form.OutputResult("Syllabear Action");
}
#endregion
}
还差什么那,当然是我们玩家啦,没有玩家的游戏还叫游戏吗?
public class Gamer
{
private IHero _hero;
public IHero Hero
{
set { _hero = value; }
}
public void Action()
{
_hero.Action();
}
}
Gamer类中包含了IHero接口,依赖倒置嘛,不管有什么新英雄,Gamer的代码不用改动了,解耦绝对的解耦,HeadFirst所说"多用组合少用继承"啦。
测试代码如下:
DotaPatternLibrary.Bridge.Gamer gamer = new DotaPatternLibrary.Bridge.Gamer();
DotaPatternLibrary.Bridge.IHero hero = new DotaPatternLibrary.Bridge.Syllabear();
gamer.Hero = hero;
gamer.Action();
hero = new DotaPatternLibrary.Bridge.Terrorblade();
gamer.Hero = hero;
gamer.Action();
看吧,可以控制的英雄可以随时切换了吧,让队友快去嘘嘘吧。
完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DotaCommon;
namespace DotaPatternLibrary.Bridge
{
public interface IHero
{
void Action();
}
/// <summary>
/// 灵魂守卫
/// </summary>
public class Terrorblade : IHero
{
public Terrorblade()
{
}
#region IHero 成员
public void Action()
{
LandpyForm.Form.OutputResult("Terrorblade Action");
}
#endregion
}
/// <summary>
/// 德鲁伊
/// </summary>
public class Syllabear : IHero
{
public Syllabear()
{
}
#region IHero 成员
public void Action()
{
LandpyForm.Form.OutputResult("Syllabear Action");
}
#endregion
}
public class Gamer
{
private IHero _hero;
public IHero Hero
{
set { _hero = value; }
}
public void Action()
{
_hero.Action();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DotaCommon;
namespace DotaPatternLibrary.Bridge
{
public interface IHero
{
void Action();
}
/// <summary>
/// 灵魂守卫
/// </summary>
public class Terrorblade : IHero
{
public Terrorblade()
{
}
#region IHero 成员
public void Action()
{
LandpyForm.Form.OutputResult("Terrorblade Action");
}
#endregion
}
/// <summary>
/// 德鲁伊
/// </summary>
public class Syllabear : IHero
{
public Syllabear()
{
}
#region IHero 成员
public void Action()
{
LandpyForm.Form.OutputResult("Syllabear Action");
}
#endregion
}
public class Gamer
{
private IHero _hero;
public IHero Hero
{
set { _hero = value; }
}
public void Action()
{
_hero.Action();
}
}
}