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

ops/2024/11/8 2:37:40/

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.ppmy.cn/ops/24755.html

相关文章

【JS】找出两个数组中的相同元素与不同元素

一、找出相同元素 &#xff08;1&#xff09;方法一 const filterArr (arr1, arr2) > {let result [];for (let i 0; i < arr1.length; i) {for (let j 0; j < arr2.length; j) {if (arr1[i] arr2[j]) {result.push(arr1[i]);}}}return result; };&#xff08;…

[最新]CentOS7设置开机自启动Hadoop集群

安装好Hadoop后我们可以使用开机自启动的方式&#xff0c;节约敲命令的时间。注意是centOS7版本!!!和centOS6版本区别非常大!!! 1、切换到系统目录 [rootmaster ~]# cd /etc/systemd [rootmaster systemd]# ll total 32 -rw-r--r-- 1 root root 720 Jun 30 23:11 bootcha…

Leetcode—1329. 将矩阵按对角线排序【中等】(unordered_map、priority_queue)

2024每日刷题&#xff08;121&#xff09; Leetcode—1329. 将矩阵按对角线排序 实现代码 class Solution { public:vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {const int m mat.size();const int n mat[0].size();unorder…

设计模式学习笔记 - 项目实战二:设计实现一个通用的接口幂等框架(实现)

概述 上篇文章&#xff0c;我们讲解了幂等框架的设计思路。在正常情况下&#xff0c;幂等框架的处理流程是比较简单的。调用方生成幂等号&#xff0c;传递给实现方&#xff0c;实现方记录幂等号或者用幂等号判重。但是&#xff0c;幂等框架要处理的异常情况很多&#xff0c;这…

CSS Grid 那些鲜为人知的内幕

❝ 叔本华&#xff1a;人生没有意义&#xff0c;人生就是一团欲望&#xff0c;欲望满足了就空虚&#xff0c;满足不了就痛苦&#xff0c;人生就像摆钟在空虚和痛苦中来回摇摆。 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder …

报错:图片验证码接口对接vue+springboot(下一个笔记会记录整个验证码的代码)

问题&#xff1a;空指针异常ai: 根据错误堆栈信息中提供的方法调用位置&#xff0c;看起来空指针异常是在 AuthCodeServiceImpl 类的 authUserCoded 方法的第 41 行发生的。 为了解决这个问题&#xff0c;你可以检查 AuthCodeServiceImpl 类中 authUserCoded 方法的第 41 行&am…

从零手写实现 apache Tomcat-01-入门介绍

创作缘由 平时使用 tomcat 等 web 服务器不可谓不多&#xff0c;但是一直一知半解。 于是想着自己实现一个简单版本&#xff0c;学习一下 tomcat 的精髓。 怎么实现一个 tomcat 呢&#xff1f; Tomcat就像是一个用Java语言搭起来的大舞台&#xff0c;专门用来演出那些用Jav…

基于ESP32—CAM物联网WIFI小车

一.功能概述 摄像头的画面可以实时的传输到,点灯科技APP的手机端,这样可以实时查看周围环境的状况,灯光不足,画面不清晰时可以打开灯光照明。手机端有左转、右转、前进、后退、停止的按钮。可以根据自己需要,来控制小车。手机APP端还设有模式切换的按钮,可以根据需要进行…