前言
站在巨人的肩膀上 ,我知道了下机可以用到策略模式,《大化设计模式》这本书中说到可以将Context类与简单工厂相结合,从而将判断交给Context类。但是,书中还说可以进一步利用反射来改进Context类,这样更加的符合开-闭原则。
策略模式+反射实现
Context类无非就是根据用户的类型,实例化相应的类。我们可以利用反射技术,从配置文件中读取需要实例化的类名。但是我们接收的用户类型是中文的,而类名一般都是英文的,所以需要转换一下,那么我们可以先将从配置文件读取到的信息存到字典里,再利用字典来进行中英文转换。
1. 首先,反射需要用到配置文件,所以配置文件怎么写呢?
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<appSettings>
<!--server中.代表本地,也可以用local或localhost代替-->
<add key="ConnStr" value="server=.;database=charge;user ID=sa;pwd=123456"/>
<add key="DB" value="Sql"/>
<!--字典的键值,反射到字典中,利用字典将中文转换成相应的类名-->
<add key="dicKey" value="固定用户,临时用户"/>
<add key="dicValue" value="FixedUser,TempUser"/>
</appSettings>
</configuration>
2. 接下来是Context类
public class Context
{
Type type = null;
public Context(string userType)
{
//定义两个数组用来接收字典的键和值
string[] dicKey = ConfigurationManager.AppSettings["dicKey"].Split(',');
string[] dicValue = ConfigurationManager.AppSettings["dicValue"].Split(',');
Dictionary<string, string> dic = new Dictionary<string, string>();
//将数组中的键和值依次添加到字典中
for (int i = 0; i < dicKey.Length; i++)
{
dic.Add(dicKey[i].Trim(), dicValue[i].Trim());
}
//利用字典中英文转换,得到需要实例化的类名
string className = "BLL.StudentBLL." + dic[userType];
//利用反射获得相应用户类型的对象
type = (Type)Assembly.Load("BLL").CreateInstance(className);
}
public decimal AcceptCash(LineLog lineLog,BasicdataInfo basicdataInfo)
{
return type.AcceptCash(lineLog, basicdataInfo);
}
}
接下来说一说为什么要用反射呢?
利用了反射技术,更加的符合开-闭原则,如果想增加新的用户类型,Context类也不用更改,直接添加相应的类以及更改配置文件即可。虽然这个项目很小,但是还是想体会一下反射技术。
后语
这不是最好的办法,但是我的能力有限,只能想到这儿了。看网上的解决办法,还可以通过从txt文件中读取信息到字典中,欢迎大家互相讨论交流,我知道大家还有更好的解决办法,如果您有更好的建议,欢迎在下方评论。