.NET 面向对象程序设计 —— 设计模式 详细版

1.反射

        “到底如何去改良策略模式呢?”小菜恳切地问道。

        “你仔细观察过没有,你的代码,不管是用工厂模式写的,还是用策略模式写的,那个分支的 switch 依然去不掉。 原因在哪里?”大鸟反问道。

        “因为程序里有下拉选择,用户是有选择的,那么程序就必须要根据用户的选择来决定实例化哪一个子类对象。 无论是在客户端窗体类编程还是到工厂类里编程,这个 switch 总是少不掉的。问题主要出在这里。”小菜十分肯定的说。

        “是呀,”大鸟道,“所以我们要考虑的就是可不可以不在程序里写明‘如果是打折就去实例化 CashRebate 类,如 果是返利就去实例化 CashReturn 类’这样的语句,而是在当用户做了下拉选择后,再根据用户的选择去某个地方找应 该要实例化的类是哪一个。这样,我们的 switch 就可以对它说再见了。”

        “听不太懂哦,什么叫‘去某个地方找应该要实例化的类是哪一个’?’小菜糊涂地说。 “,我要说的就是一种编程方式:依赖注入(Dependency Injection),从字面上不太好理解,我们也不去管它。关 键在于如何去用这种方法来解决我们的 switch 问题。

        本来依赖注入是需要专门的 IoC 容器提供,比如 spring.net,显然 当前这个程序不需要这么麻烦,你只需要再了解一个简单的.net 技术‘反射’就可以了。” “大鸟,你一下子说出又是‘依赖注入’又是‘反射’这些莫名其妙的名词,我有点晕哦!”小菜有些犯困,“我 就想知道,如何向 switch 说 bye-bye!至于那些什么概念我不想了解。” “心急讨不了好媳妇!你急什么?”大鸟嘲笑道,“反射技术看起来很玄乎,其实实际用起来不算难。”

“请看下面的两个样例:

1//实例化方法一 
2//原来我们把一个类实例化是这样的 
3Animal animal=new Cat(); //声明一个动物对象,名称叫 animal,然后将 animal 实例化成猫类的对象 
4 
5//实例化方法二 
6//我们还可以用反射的办法得到这个实例 
7using System.Reflection;//先引用 System.Reflection 
8//假设当前程序集是 AnimalSystem,名称空间也是 AnimalSystem 
9Animal animal = (Animal)Assembly.Load("AnimalSystem").CreateInstance("AnimalSystem.Cat"); 其中关键是 Assembly.Load("程序集名称").CreateInstance("名称空间.类名称") 

         那也就是说,我们可以在实例化的时候,再给计算机一个类的名称字符串,来让计算机知道应该实例化哪一个类。”大 鸟讲解道。

        “ 你 的 意 思 是 , 我 之 前 写 的 ‘ cc.setBehavior(new CashNormal()); ’ 可 以 改 写 为 ‘cc.setBehavior((CashSuper)Assembly.Load("商场管理软件").CreateInstance("商场管理软件.CashNormal")’,不过,这只 不过是换了种写法而已,又有什么神奇之处呢?”小菜依然迷茫。 “分析一下,原来 new CashNormal()是什么?是否是写死在程序里的代码,你可以灵活更换吗?”大鸟问。 “不可以,那还换什么,写什么就是什么了呗。”

        “那你说,在反射中的 CreateInstance("商场管理软件.CashNormal"),可以灵活更换‘CashNormal’吗?”大鸟接 着问。 “还不是一样,写死在代码…………等等,哦!!!我明白了。”小菜一下子顿悟过来,,兴奋起来。“因为这里是字 符串,可以用变量来处理,也就可以根据需要更换。哦,My God!太妙了!”

客户端主要代码:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/3725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hadoop大数据原理与应用------初识Hadoop数据集

哪种运行模式是使用Hadoop的最佳方式,真实Hadoop集群的运行均采用该模式? 真实Hadoop集群的运行通常采用全分布模式(Fully Distributed Mode)。在全分布模式下,Hadoop集群会跨越多个物理或虚拟节点,每个…

npm/yarm常用命令

npm命令 标题npm作为嵌入在node中的功能,两个起到相辅相成作用,所以只要安装了node就可以使用npm! 查看nodejs版本: node -v 【或 node --version】 查看nodejs版本: npm -v 查看npm下载仓库地址: npm con…

阿里云X魔搭社区Create@AI创客松第四届冠军:MumuLab

4月13日终于迎来了线下Demo Day,此前阿里云 X 魔搭社区 X Datawhale CreateAI创客松已经紧锣密鼓地准备了一个多月时间,全球150团队报名、创作出66作品、评选出25支团队进入决赛,作品范围覆盖从办公效率到法律调解再到游戏互动以及构建童话世…

h5键盘弹出收起时引起的页面变化

h5键盘弹出收起时引起的页面变化 键盘弹出时会导致窗口发生变化,置于底部的操作项会被顶上来,所以在键盘弹出的时候处理一下页面节点 通过监听页面窗口大小变化判断键盘状态键盘弹出时隐藏底部操作项在页面加载完成时执行即可 export function keyboa…

机器人技术概述_3.机器人的分类

由于机器人的用途广泛,有许多种分类。行业不同,机器人的应用场景不一样,由于要求的不同,机器人的控制方式也存在许多差异,这里简要描述两种分类。 1.按控制方式分类 如果按照要求的控制方式分类,机器人可分…

构建交通新动脉 激活襄阳城市发展动力

—— 襄阳环线提速改造工程通车 即从巴峡穿巫峡,便下襄阳向洛阳。襄阳,这座位于汉江之滨的历史文化古城,自古便为交通要塞,正以崭新的姿态迈入一个新时代——城市交通快速化时代。4月26日,襄阳环线提速改造工程正式通车,“一轴三环九放射”城市骨架路网体系基本形成。它不仅是…

python 实现用户登录

1. JWT Token 参考:https://www.zhihu.com/question/364616467 jwt官网:https://jwt.io/#debugger-io 1.1. Token Token 是一个宽泛的术语,它可以指代任何一种用于身份验证的机制。Token 常常被用在验证和授权流程中。Token 可以有不同的形…

C语言笔试题之找出数组的最大公约数

找出数组的最大公约数 实例要求 1、给定一个整数数组 ,返回数组中最大数和最小数的最大公约数;2、两个数的最大公约数是能够被两个数整除的最大正整数;示例: 实例分析 1、要找到数组中最大数和最小数的最大公约数&#xff1b…

python 中使用 ESP8266 实现语音识别(或热词检测)

介绍 我的大部分家庭自动化都是通过对网络中的设备执行 HTTP 请求来控制的。 (例如:开灯、打开收音机、控制加热系统...... 这可以使用ESP8266轻松完成。我有一个控制器和一个触摸传感器,当我在床上时用它来控制灯光和音乐。 像 Amazon Echo 或 Google Homepod 一样添加语…

Apache RocketMQ ACL 2.0 全新升级

作者:徒钟 引言 RocketMQ 作为一款流行的分布式消息中间件,被广泛应用于各种大型分布式系统和微服务中,承担着异步通信、系统解耦、削峰填谷和消息通知等重要的角色。随着技术的演进和业务规模的扩大,安全相关的挑战日益突出&am…

《AI创作类工具之十四——​ Verse》

一.简介 官网:Verse - 新一代生产力工具 Verse是一款功能丰富的智能写作工具,它集合了实时预览、代码高亮、表格编辑和数学公式支持等特色功能,为用户提供了高效的文档编写和管理体验。Verse不仅界面设计简洁,使用户能够更专注于文档内容,还提供了丰富的功能来帮助用户更…

Elment ui 表单上滑 加载更多数据方法

方法记录 方便以后使用 方法一&#xff1a; <template><div><el-table:data"tableData"height"calc(100vh - 300px)"ref"table":show-header"false"><el-table-columnprop"date"label"日期"…

HPE Aruba Networking推出新一代Wi-Fi 7接入点 助力企业高效应对安全、AI与物联网挑战

HPE ArubaNetworking推出的全新Wi-Fi 7接入点&#xff0c;提供全面的AI就绪边缘IT解决方案&#xff0c;旨在为用户和物联网设备提供安全、高性能的连接服务&#xff0c;以实现数据的捕获和路由&#xff0c;从而满足AI训练和推理需求 休斯顿-2024年4月23日-慧与科技(NYSE: HPE)近…

vue+html5+css制作日历代码,工作日配置

目录 1.日历页面 2.工作日查询、自然日查询 js 3.修改工作日配置 4.数据库&#xff0c;表结构 5.初始化数据 因系统需要&#xff0c;需要制作一个功能--工作日配置。 需要的业务有&#xff1a; 1.初始化与国家放假情况一致&#xff0c;之后支持手动进行工作日配置&#…

Python 网络与并发编程(四)

文章目录 协程Coroutines协程的核心(控制流的让出和恢复)协程和多线程比较协程的优点协程的缺点 asyncio实现协程(重点) 协程Coroutines 协程&#xff0c;全称是“协同程序”&#xff0c;用来实现任务协作。是一种在线程中&#xff0c;比线程更加轻量级的存在&#xff0c;由程…

《欢乐钓鱼大师》攻略,钓友入坑必备!

欢迎来到《欢乐钓鱼大师》&#xff01;在这个游戏里&#xff0c;你可以尽情享受垂钓的乐趣&#xff0c;通过不断更换和升级高阶鱼竿&#xff0c;轻松地钓到各种稀有鱼类。因为许多玩家在挑战关卡时遇到了一些困难&#xff0c;所以今天我给大家带来了《欢乐钓鱼大师攻略指南》&a…

日志框架整合SpringBoot保姆级教程+日志文件拆分(附源码)

目录 介绍 日志概述 日志文件 调试日志 系统日志 日志框架 日志框架的作用 日志框架的价值 流行的日志框架 SLF4J日志门面 介绍 环境搭建简单测试 集成log4j logback Logback简介 Logback中的组件 Logback配置文件 日志输出格式 控制台输出日志 输出日志到…

代谢网络模型学习笔记(序章)

代谢模型学习笔记&#xff08;序章&#xff09; 全文目录 代谢模型学习笔记&#xff08;序章&#xff09;-1、 闲言碎语0 、前言说明重点说明 1 、内容概述1.1 文献分享 Shifts in growth strategies reflect tradeoffs in cellular economics 2、 论文笔记3、思考讨论 -1、 闲…

vue-admin-template项目实现中英文切换

实现效果&#xff1a; 1.安装 *注意版本号 npm install vue-i18n8.24.5 -S2.新建文件夹 在src目录下新建lang文件夹&#xff0c;里面有3个文件 // index.js import Vue from vue import VueI18n from vue-i18n import Cookies from js-cookie import elementEnLocale fr…

OpenHarmony音视频—opus

简介 Opus是一种用于在互联网上进行交互式语音和音频传输的编解码器。它可以从低比特率窄带语音扩展到非常高的高品质立体声音乐。 下载安装 直接在OpenHarmony-SIG仓中搜索opus并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的opus库代码存在以下路径&a…