利用反射+多态替换条件语句

  /*利用反射+多态替换条件语句*/
    class Program
    {
        public static void Main(string[] args)
        {
            /*
             * 用户发送一个命令,让代码去指定Commander
             * 
             * <?xml version="1.0" encoding="utf-8" ?><Command><CommandType>Start</CommandType></Command>
             */

            //解析命令

            //调用指定的命令
            Commander commander = null;
            ICommandFactory commandFactory = new CommandFactory();
            commander = commandFactory.GetCommander("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Command><CommandType>Start</CommandType></Command>");
            Drive(commander);
            commander = commandFactory.GetCommander("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Command><CommandType>Stop</CommandType></Command>");
            Drive(commander);
            Console.Read();
        }static void Drive(Commander commander)
        {
            commander.Execute();
        }
    }public interface ICommandFactory
    {
        Commander GetCommander(string xmlCommander);
    }

    public class CommandFactory : ICommandFactory
    {
        public Commander GetCommander(string xmlCommander)
        {
            IXmlFactory xmlFactory = new XmlFactory(xmlCommander);
            var iXml = xmlFactory.GetXml();
            var command = iXml.GetCommand();
            return iXml.GetCommander(command);
            //通过字符串返回指定的命令
            //return new StartCommander();
        }
    }

    public abstract class Commander
    {
        public abstract void Execute();
    }

    public class StartCommander : Commander
    {
        public override void Execute()
        {
            Console.WriteLine("当前汽车已经启动!");
        }
    }

    public class StopCommander : Commander
    {
        public override void Execute()
        {
            Console.WriteLine("当前汽车已经停止!");
        }
    }

    public interface IXmlFactory
    {
        IXml GetXml();
    }

    public class XmlFactory : IXmlFactory
    {
        private string _xmlCommand = string.Empty;

        public XmlFactory(string xmlCommand)
        {
            this._xmlCommand = xmlCommand;
        }
        public IXml GetXml()
        {
            return new CommandXml(this._xmlCommand);
        }
    }

    public interface IXml
    {
        Command GetCommand();

        Commander GetCommander(Command command);
    }

    public class CommandXml : IXml
    {
        private string _xmlCommand = string.Empty;
        public CommandXml(string xmlCommand)
        {
            this._xmlCommand = xmlCommand;
        }
        public Command GetCommand()
        {
            XmlReader xmlReader = XmlReader.Create(new System.IO.StringReader(_xmlCommand));
            XmlSerializerHelper xmlHelper = new XmlSerializerHelper(xmlReader);
            return xmlHelper.ReadXml<Command>();
        }


        public Commander GetCommander(Command command)
        {
            /*通过反射来创建指定的命令*/
            var commandString = "命名空间." + command.CommandType + "Commander";
            Assembly commandAssembly = System.Reflection.Assembly.GetExecutingAssembly();
            var commandObject = commandAssembly.CreateInstance(commandString);
            return (Commander)Activator.CreateInstance(commandObject.GetType());
        }
    }

    #region 数据模型

    [XmlRoot("Command")]
    public class Command
    {
        [XmlElement("CommandType")]
        public string CommandType { get; set; }
    }
    #endregion

    public class XmlSerializerHelper
    {
        private XmlReader _xmlReader = null;
        public XmlSerializerHelper(XmlReader xmlReader)
        {
            if (xmlReader == null) throw new ArgumentNullException("无效的参数xmlReader");
            this._xmlReader = xmlReader;
        }

        public T ReadXml<T>() where T : class,new()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(_xmlReader);
        }
    }

 

posted @ 2014-10-29 23:02  fujc2dev  阅读(223)  评论(0编辑  收藏  举报