概述
C#机房重构-修改密码之职责链模式+反射
- 前言
- 修改密码类图
- 代码实现
- 配置文件
- B层代码
- 职责链类
- Handler类
- PastPassWordHandler类
- NewPassWordHandler类
- UpDatePassWordFactory类
前言
通过小组集体学习,深入的讨论学习了职责链模式,职责链模式主要处理的业务逻辑常是顺序或者是选择结构,提出的请求沿着这条对象链传递一直到有对象能够处理为止。由于职责链不太符合开闭原则,我如果在这条业务线加一个功能,可能就需要重新排序,就需要修改类里面的代码,这时候我们可以利用反射和配置文件,通过修改配置文件来实现可扩充。
修改密码类图
代码实现
配置文件
<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);
}
}
最后
以上就是鳗鱼短靴为你收集整理的C#机房重构-修改密码之职责链模式+反射前言修改密码类图代码实现的全部内容,希望文章能够帮你解决C#机房重构-修改密码之职责链模式+反射前言修改密码类图代码实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复