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);
            }
        }
  • 相关阅读:
    【常用配置】Spring框架web.xml通用配置
    3.从AbstractQueuedSynchronizer(AQS)说起(2)——共享模式的锁获取与释放
    2.从AbstractQueuedSynchronizer(AQS)说起(1)——独占模式的锁获取与释放
    1.有关线程、并发的基本概念
    0.Java并发包系列开篇
    SpringMVC——DispatcherServlet的IoC容器(Web应用的IoC容器的子容器)创建过程
    关于String的问题
    Spring——Web应用中的IoC容器创建(WebApplicationContext根应用上下文的创建过程)
    <<、>>、>>>移位操作
    System.arraycopy(src, srcPos, dest, destPos, length) 与 Arrays.copyOf(original, newLength)区别
  • 原文地址:https://www.cnblogs.com/xhh-lite/p/4060874.html
Copyright © 2011-2022 走看看