zoukankan      html  css  js  c++  java
  • 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和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。
  • 相关阅读:
    华为数据之道03
    机器学习10讲 第二讲
    机器学习10讲 第一讲
    07.TensorFlow双向循环神经网络
    06.TensorFlow循环神经网络
    华为数据之道:华为数据治理2
    线性回归
    MySQL配置文件my.cnf的理解
    Linux怎么查看软件安装路径 查看mysql安装在哪
    hadoop-2.7.4-nodemanager无法启动问题解决方案
  • 原文地址:https://www.cnblogs.com/pangxiaoliang/p/1531136.html
Copyright © 2011-2022 走看看