标签:des style blog io color ar sp 数据 div
/*利用反射+多态替换条件语句*/ 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); } }
标签:des style blog io color ar sp 数据 div
原文地址:http://www.cnblogs.com/xhh-lite/p/4060874.html