C#机房重构-修改密码之职责链模式+反射

简介: C#机房重构-修改密码之职责链模式+反射

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);
        }
    }
目录
相关文章
|
9天前
|
BI C# C++
C#机房重构之报表
C#机房重构之报表
14 0
|
9天前
|
SQL C# 数据库
C#机房重构之错误集锦(三)
C#机房重构之错误集锦(三)
11 0
|
9天前
|
C#
C# 机房合作代码块
C# 机房合作代码块
15 0
|
9天前
|
C#
C#机房重构之错误集锦(二)
C#机房重构之错误集锦(二)
16 0
|
4月前
|
设计模式 C#
C#反射机制实现开闭原则的简单工厂模式
C#反射机制实现开闭原则的简单工厂模式
18 0
|
5月前
|
存储 C# 开发者
C# | 通过反射将对象属性展示在TreeView中
在编程过程中,我们经常需要处理复杂的对象和数据结构。将这些数据结构展示在UI界面上是很有用的,可以帮助开发者更好地理解和分析数据。 而TreeView作为一种常见的控件,可以以树状结构的方式展示数据,非常适合用于展示层次化的对象。 本文将介绍如何使用TreeView控件展示一个对象,并且可以动态处理对象中的属性和子对象。通过本文的学习,您将学会如何更好地理解和展示数据,提高编程效率。
36 0
C# | 通过反射将对象属性展示在TreeView中
|
5月前
|
安全 C# 图形学
C#的反射机制
C#的反射机制
|
6月前
|
存储 Java API
C#反射(Reflection)详解
反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。反射指程序可以访问、检测和修改它本身状态或行为的一种能力。通俗一点:我们在获取其他实体类的字段名或实列,只能获取公有的,而有了反射之后可以获取私有的,可以获取他的基类等等,可以说把家底查得清清楚楚。
31 1
|
8月前
|
开发框架 缓存 安全
C#OOP之十三 组件、程序集与反射
C#OOP之十三 组件、程序集与反射
38 0
|
8月前
|
开发框架 .NET Java
C#下反射动态加载dll后如何卸载?
C#下反射动态加载dll后如何卸载?