java设计模——反射的应用 (利用反射来去除if判断语句)
利用反射来去除if判断语句
我的以前写的一个查分系统,就是部长让我写的那个,使用一个分发器(函数),他会根据传递进来的字符串参数调用不同的方。 If(“add”.equalsIgnoreCase(funcName)) { return add();} ,每增加一个方法,就需要增加一个if分支,这样需要不断的修改原来的代码,需要重新编译,容易出错,面向对象的原则是“对修改关闭,对扩展开放”,因此我试着用另外一种方法来实现,利用“反射”。我们实现原理是:传入的类名称字符串,根据类名直接实例化该对象,调用内部方法。
1、因为每个函数都是用来执行一定的业务逻辑的(操作数据库),因此先定义一个接口,然后定义一个service函数,这个接口的主要功能就是能实现业务函数名称统一化,规范化,(我只要调同一个函数就可以,但类的不同函数内部实现是不一样化),实例化对象时变量的引用使用该类型(多态),如果不这样,那需要频繁的修改代码,类型不同吗,你懂得。
1、每个相应的业务功能分别定义为一个类,并继实现接口,并实现service函数,例如 增加人员信息为一个类,删除人员信息为一个类,根据不同的类,函数的实现也不同,具体实现不在叙述。
2、这样就可以将上边的if语句去掉,利用java反射机制,只要传入相关业务类的类名 字符串 ,利用反射实例化该类,并调用service方法,就可以实现相关的业务逻辑。
使用上边方法,如果要增加新的业务,例如:修改人员信息,只要定义新的业务类,并实现上述接口,实现servcie方法,只要传入该类的类名,就可自动调用service方法实现业务逻辑,根本就不需要修改原来(用反射代替if判断)的代码了。就算删除该业务类,也比较方边,不使用该类即可,想反,if判断 就需要修改代码,删除相关的业务分支。
如果类名比较长,传入字符串不方便,可定义一个配置文件,key=value的形式,key是类名的别名,value是类的全路径名,只要传入该key值,然后利用程序去查找配置文件,找出对应的value,便可找到该类名,并利用反射实例化。
具体的反射使用方法,可参考本空间的另一篇文章,java反射。
java设计模——反射的应用 (利用反射来去除if判断语句)的更多相关文章
- Java中的反射机制,利用反射访问私有
利用反射,首先是Class对象的获取,之后是Method和Field对象的获取. 以Method为例,从文档中可以看到: getMethod()方法返回的是public的Method对象, 而getD ...
- 【java】工厂模式Factory,利用反射改进
package 反射; interface Product{ public void produce(); } class socks implements Product{ @Override pu ...
- C#反射实例(一) 利用反射使用类库
在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆,今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西,在学好了这一切的基础上,大家可以学习反射的具体 ...
- Java设计模-过滤器模式
过滤器模式 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接 ...
- Java实现回形数,只利用数组、循环和if-else语句
import java.util.Scanner; public class learn { public static void main(String[] args){ System.out.pr ...
- 利用 操作符特性 代替if判断语句
参考:http://blog.csdn.net/speedme/article/details/22916181 1.&&的判断特性 #include <stdio.h> ...
- Java开发笔记(七十九)利用反射技术操作私有属性
早在介绍多态的时候,曾经提到公鸡实例的性别属性可能被篡改为雌性,不过面向对象的三大特性包含了封装.继承和多态,只要把性别属性设置为private私有级别,也不提供setSex这样的性别修改方法,那么性 ...
- [Java反射基础四]通过反射了解集合泛型的本质
本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 ArrayList list1 = new ArrayLis ...
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
随机推荐
- Codeforces 580A - Kefa and First Steps
580A - Kefa and First Steps 思路:dp dp[i]表示包括前i个元素中a[i]在内的最大增序列. 代码: #include<bits/stdc++.h> usi ...
- angular5 directive和component的区别
指令分为三类,组件,属性指令和结构性指令 组件(Component directive):UI组件,继承于Directive: 属性指令(Attribute directive):改变组件的样式: 结 ...
- WinForm一次只打开一个程序
WinForm如果我们希望一次只打开一个程序,那么我们在程序每次运行的时候都需要检测线程是否存在该程序,如果存在就呼出之前的窗体,C#代码如下: using System; using System. ...
- python通过get方式,post方式发送http请求和接收http响应-urllib urllib2
python通过get方式,post方式发送http请求和接收http响应-- import urllib模块,urllib2模块, httplib模块 http://blog.163.com/xyc ...
- java使用freemarker生成静态html页面
1. 模板文件static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- LeetCode--176--第二高的薪水
问题描述: 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 ...
- Confluence 6 使用 LDAP 授权连接到 Confluence 内部目录
希望连接一个内部目录但是使用 LDAP 检查登录授权: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接. 单击左侧面板上面的 用户目录(User Dire ...
- python-day10--字符编码
1.回顾: 软件→操作系统→硬件 2.文本编辑器: 启动:硬盘→内存→运行(cpu) 读文件:硬盘→内存→CPU读 存文件:保存到硬盘中 3.python解释器 启动:硬盘→内存→运行(cpu) 读文 ...
- @RequiresPermissions ,@RequiresUser , @RequiresGuest ,@RequiresRoles 解释
转载地址:https://blog.csdn.net/AinUser/article/details/64920968?locationNum=1&fps=1 @RequiresPermiss ...
- 2.strcpy使用注意(2)
分析下述代码: void test2() { char string[10],str1[10]; int i; for(i=0;i<10;i++) { srtr1='a'; } strcpy(s ...