一颗不安分的创业心

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();
看吧,可以控制的英雄可以随时切换了吧,让队友快去嘘嘘吧。
完整代码:
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();
        }
    }
}
posted @ 2009-07-26 23:04  pangxiaoliang[北京]流浪者  阅读(180)  评论(0编辑  收藏  举报
小豆芽之父