C#机房重构-修改密码之职责链模式+反射
前言
通过小组集体学习,深入的讨论学习了职责链模式,职责链模式主要处理的业务逻辑常是顺序或者是选择结构,提出的请求沿着这条对象链传递一直到有对象能够处理为止。由于职责链不太符合开闭原则,我如果在这条业务线加一个功能,可能就需要重新排序,就需要修改类里面的代码,这时候我们可以利用反射和配置文件,通过修改配置文件来实现可扩充。
修改密码类图
代码实现
配置文件
<add key ="UpDatePassWord" value ="PastPassWordHandler,NewPassWordHandler"/>
B层代码
public class StudentChangePassWordBLL { bool flag; /// <summary> /// 策略模式修改密码 /// </summary> /// <param name="userInfo">用户信息用户名密码</param> /// <returns></returns> public Boolean Result(Model.UserInfo userInfo) { //声明一个数组将配置文件中的value值去除,添加到数组中 string [] UpDatePassWord = ConfigurationManager.AppSettings["UpDatePassWord"].Split(','); //实例化Handler类类型的数组 List<Handler> list = new List<Handler>(); //实例化修改密码的工厂类 UpDatePassWordFactory factory = new UpDatePassWordFactory(); //遍历数组 for (int i = 0; i < UpDatePassWord.Length; i++) { //调用工厂的方法,将实例化的类添加到集合中 list .Add (factory.Result( UpDatePassWord[i].Trim())); } //如何集合中实例化的类数量为1 if (list.Count ==1) { //体现多态 list[0].HandleRequest(userInfo); } else { //如果集合里类的数量不等于1 for (int i = 1; i <= list.Count-1; i++) { //进行排序 list[i-1].SetSuccessor(list[i ]); } } //返回结果 return flag = list[0].HandleRequest(userInfo); }
职责链类
Handler类
abstract class Handler { //声明Handler类的一个对象 protected Handler successor; /// <summary> /// 设置上下级 /// </summary> /// <param name="successor"></param> public void SetSuccessor(Handler successor ) { this.successor = successor; } //子类重写的方法 public abstract Boolean HandleRequest(Model.UserInfo userInfo); }
PastPassWordHandler类
//当原密码错误的时候有权处理,否则返回真 class PastPassWordHandler:Handler { bool flag; //实例化工厂 Factory.NormalUser.StudentChangePassWordFactory factory = new Factory.NormalUser.StudentChangePassWordFactory(); /// <summary> /// 进行密码查询,判断密码是否正确 /// </summary> /// <param name="userInfo">用户名和旧密码</param> /// <param name="newPassWord">新密码</param> /// <returns></returns> public override Boolean HandleRequest(UserInfo userInfo) {//声明一个接口类型的对象来接收工厂的返回值 IDAL.NormalUser.IStudentChangePassWordDAL idal = factory.Result(); //多态,声明DataTable类型对象result来接收返回值 DataTable result = idal.SelectPassWord(userInfo); //判断表中是否有数据 if (result.Rows.Count==0) { return flag = false; } else { //执行下一个类的方法并返回值 return successor.HandleRequest(userInfo); } } }
NewPassWordHandler类
//修改密码失败时有权处理,否则转到下一位 class NewPassWordHandler:Handler { //实例化工厂 Factory.NormalUser.StudentChangePassWordFactory factory = new Factory.NormalUser.StudentChangePassWordFactory(); bool flag; /// <summary> /// 进行修改密码的操作 /// </summary> /// <param name="userInfo">用户名和旧密码</param> /// <param name="newPassWord">新密码</param> /// <returns></returns> public override Boolean HandleRequest(UserInfo userInfo) { //定义一个接口类型的对象来接收工厂的返回值 IDAL.NormalUser.IStudentChangePassWordDAL idal = factory.Result(); //多态D层的方法 int result = idal.UpdatePassWord(userInfo); //判断返回值 if (result == 0) { return flag = false; } else { return flag = true; } } }
UpDatePassWordFactory类
class UpDatePassWordFactory { public Handler Result(string type) { //类名 string className = "BLL" + "." + type ; //反射实例化类 return (Handler )Assembly.Load("BLL").CreateInstance(className); } }