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......
完整代码如下:
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
    }
}
敬告

作者:pangxiaoliang
出处:http://www.cnblogs.com/pangxiaoliang
本文版权归pangxiaoliang和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。
原文地址:https://www.cnblogs.com/pangxiaoliang/p/1531136.html