zoukankan      html  css  js  c++  java
  • 利用反射+多态替换条件语句

      /*利用反射+多态替换条件语句*/
        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);
            }
        }
  • 相关阅读:
    python16_day18【Django_Form表单、分页】
    python16_day17【Django_session、ajax】
    django【orm操作】
    python16_day16【Django_ORM、模板】
    python16_day15【Django入门】
    python16_day14【jQuery】
    python16_day13【css、js】
    python16_day12【html、css】
    python16_day11【MQ、Redis、Memcache】
    python16_day10【SelectWeb、SelectWget、paramiko、pymysql】
  • 原文地址:https://www.cnblogs.com/xhh-lite/p/4060874.html
Copyright © 2011-2022 走看看