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

  /*利用反射+多态替换条件语句*/
    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);
        }
    }
时间: 2025-01-31 21:04:04

利用反射+多态替换条件语句的相关文章

重构第四天 : 用多态替换条件语句(if else &amp; switch)

面相对象的一个核心基础就是多态,当你要根据对象类型的不同要做不同的操作的时候,一个好的办法就是采用多态,把算法封装到子类当中去. 重构前代码: 1 public abstract class Customer 2 { 3 } 4 5 public class Employee : Customer 6 { 7 } 8 9 public class NonEmployee : Customer 10 { 11 } 12 13 public class OrderProcessor 14 { 15

编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句

建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand { Start, Stop } 当前该枚举存在两个命令:开始.停止.又假设有一个驾驶方法可以处理车辆接收到的指令.一开始我们可能像下面这样编码: static void Main(string[] args) { DriveCommand command = DriveCommand.Start; Drive(command); comman

重构第31天 使用多态替代条件语句( Replace conditional with Polymorphism)

理解:本文中的”使用多态代替条件判断”是指如果你需要检查对象的类型或者根据类型执行一些操作时,一种很好的办法就是将算法封装到类中,并利用多态性进行抽象调用. 详解:本文展示了面向对象编程的基础之一“多态性”, 有时你需要检查对象的类型或者根据类型执行一些操作时,一种很好的办法就是将算法封装到类中,并利用多态性进行抽象调用. 如下代码所示,OrderProcessor 类的ProcessOrder方法根据Customer 的类型分别执行一些操作,正如上面所讲的那样,我们最好将OrderProces

重构第六天:用条件语句替换异常

在工作中经常遇到用异常去控制程序流程,下面是一个普遍的例子: public class Microwave { private IMicrowaveMotor Motor { get; set; } public bool Start(object food) { bool foodCooked = false; try { Motor.Cook(food); foodCooked = true; } catch (InUseException) { foodcooked = false; }

以多态取代条件表达式

1.案例 话说最近直播很火嘛,反正我今天已经看了一晚上大胸了 我们看到,直播间里大致分为3类观众: 1.普通观众 2.房管 3.超管 如何区分这三种观众呢?我们发现,普通观众只显示自己的昵称,房管在自己的昵称前面还有一个醒目的“房管”标记,当然,超管的昵称前有个醒目的“超管”标记.看直播的都希望自己有个标记,因为这样才能装13啦... 2.条件表达式 现在,我们通过编写代码来区分这3种观众. 1.编写3个类. class CommonAudience; //普通观众 class HouseMan

Python 3 条件语句

条件语句:  用于判定,判定是否符合某条件,符合则执行,不符合则不执行该条件所定义的操作. 一步判定:  用于理解不会这样使用. if  1==1:    if条件判定只能出现一次. print("1")  这里的print相对于if 有四个空格或者一个Tab键的缩进,意思是print是if代码当中的一部分. 1==1 是固定写死的条件,平常我们会采用动态条件而不是写死的条件,这里仅作演示之用.if 后面必须加条件 ,条件是要经过布尔运算的,运算结果为True时,那么执行该条件语句当中

利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理

利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论:0 | 浏览:45 | 该类在MVC中可以方便管理配置信息,可以直接把Model储存进数据库或者从数据库去除数据转为Model. 1 何为配置项目? 比如网站的名称,页脚信息,meta中的KeyWord信息等,如果不想硬编码到网页里,就需要使用配置文件进行储存,通常都是储存到数据库中.使用的时候读取出来

Python成长之路第一篇(4)_if,for,while条件语句

有了以上的基本基础,已经上面写的几个小练习,大家肯定有很多的不满,比如查询为什么查询一次就退出了呢?下面我们来学习条件语句 一.万恶的加号 以前我们在print的时候如果要加上变量都有是使用+来作为连接,但是这样做是不好的 因为在使用加号的时候,会在内存中开辟新的内存地址来存放新的内容这样做的坏处就是增加了内存的消耗 那么我们该怎么办呢? (1)字符串格式化 ①内置占位符 Python 支持格式化字符串的输出 .尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符

DeDeCMS后台批量修改替换sql语句大全

有时候后台文章内容.标题或者锚文本出错,需要修改批量修改,那么就需要用dedecms的sql语句进行批量修改了. 利用dedecms后台SQL命令行工具批量修改内容,路径和超链接等信息.语句 DEDECMS SQL命令批量替换1.更改文章中的内容update dede_addonarticle set body=replace(body,'原来的字符','替换后的字符')例子解释:update dede_addonarticle set body=replace(body,'软件下载','插件下