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


      /*利用反射+多态替换条件语句*/
        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);
            }
        }
  • 相关阅读:
    Pytest单元测试框架之FixTure内置临时文件tmpdir操作
    Python+Request库+第三方平台实现验证码识别示例
    Pytest单元测试框架之parametrize参数化
    Pytest单元测试框架之setup/teardown模块示例操作
    mysql匿名账户登录导致的"ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'"错误
    求全排列
    (转载)你真的会写单例模式吗——Java实现
    《大话设计模式》之--第14章 老板回来,我不知道----观察者模式
    关于java Integer大小比较的问题
    Java char[] 数组转为 String 的两种方式
  • 原文地址:https://www.cnblogs.com/xhh-lite/p/4060874.html
Copyright © 2020-2023  润新知