设计模式-责任链模式

Posted fanfan-90

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-责任链模式相关的知识,希望对你有一定的参考价值。

定义

责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕

案例

客户端输入校验,需要多个校验步骤,比如sql注入校验、违禁词校验、js校验

客户端调用

var dbHandler = new DBCheckHandler();
dbHandler.SetNextHandler(new FHQCheckHandler()).SetNextHandler(new JSCheckHandler());
dbHandler.Handle("alert");//输出js校验未通过

责任链

    public abstract class CheckHandler
    {
        protected CheckHandler NextHandler = null;

        public CheckHandler SetNextHandler(CheckHandler nextHandler)
        {
            this.NextHandler = nextHandler;
            return nextHandler;
        }
        public abstract bool Handle(string content);
    }
    /// <summary>
    /// 数据库校验,防止sql注入
    /// </summary>
    public class DBCheckHandler : CheckHandler
    {
        string[] strs = new string[] { "SELECT", "UPDATE", "DELETE", "DROP", "WHERE", "FROM" };
        public override bool Handle(string content)
        {
            foreach (var str in strs)
            {
                if (content.Contains(str))
                {
                    Console.WriteLine("提交内容中不允许包含数据库违禁词");
                    return false;
                }
            }
            if (this.NextHandler != null)
            {
                return this.NextHandler.Handle(content);
            }
            return true;
        }
    }
    /// <summary>
    /// 违禁词校验
    /// </summary>
    public class FHQCheckHandler : CheckHandler
    {
        string[] strs = new string[] { "wei尼", "bao子", "皇帝", "大大" };
        public override bool Handle(string content)
        {
            foreach (var str in strs)
            {
                if (content.Contains(str))
                {
                    Console.WriteLine("违禁词校验未通过");
                    return false;
                }
            }
            if (this.NextHandler != null)
            {
                return this.NextHandler.Handle(content);
            }
            return true;
        }
    }
    /// <summary>
    /// js校验
    /// </summary>
    public class JSCheckHandler : CheckHandler
    {
        string[] strs = new string[] { "<script>", "alert", "location.", "window.open" };
        public override bool Handle(string content)
        {
            foreach (var str in strs)
            {
                if (content.Contains(str))
                {
                    Console.WriteLine("js校验未通过");
                    return false;
                }
            }
            if (this.NextHandler != null)
            {
                return this.NextHandler.Handle(content);
            }
            return true;
        }
    }

以上是关于设计模式-责任链模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式----责任链模式

设计模式之责任链模式

责任链模式

前端探索告别烂代码 用责任链模式封装网络请求

(十五)责任链模式-代码实现

设计模式:责任链模式