设计模式【拦截过滤器模式InterceptingFileterPattern】

拦截过滤器模式

拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。

  • 过滤器(Filter) - 过滤器在请求处理程序执行请求之前或之后,执行某些任务。
  • 过滤器链(Filter Chain) - 过滤器链带有多个过滤器,并在 Target 上按照定义的顺序执行这些过滤器。
  • Target - Target 对象是请求处理程序。
  • 过滤管理器(Filter Manager) - 过滤管理器管理过滤器和过滤器链。
  • 客户端(Client) - Client 是向 Target 对象发送请求的对象。

实现

我们将创建 FilterChainFilterManagerTargetClient 作为表示实体的各种对象。AuthenticationFilter 和 DebugFilter 表示实体过滤器。

InterceptingFilterDemo,我们的演示类使用 Client 来演示拦截过滤器设计模式。

拦截过滤器模式的 UML 图

步骤 1-创建过滤器接口Filter

Filter.cs

namespace Intercepting_Filter_Pattern
{
    interface Filter
    {
        void execute(string request);
    }
}

步骤 2-创建实体过滤器

AuthenticationFilter.cs

using System;
namespace Intercepting_Filter_Pattern
{
    class AuthenticationFilter : Filter
    {
        public void execute(string request)
        {
            Console.WriteLine("Authenticating request: " + request);
        }
    }
}

DebugFilter.cs

using System;
namespace Intercepting_Filter_Pattern
{
    class DebugFilter : Filter
    {
        public void execute(string request)
        {
            Console.WriteLine("request log: " + request);
        }
    }
}

步骤 3-创建Target

Target.cs

using System;
namespace Intercepting_Filter_Pattern
{
    class Target
    {
        public void execute(string request)
        {
            Console.WriteLine("Executing request: " + request);
        }
    }
}

步骤 4-创建过滤器链

FilterChain.cs

using System.Collections.Generic;
namespace Intercepting_Filter_Pattern
{
    class FilterChain
    {
        List<Filter> filters = new List<Filter>();
        Target target;

        public void addFilter(Filter filter)
        {
            filters.Add(filter);
        }

        public void execute(string request)
        {
            foreach (var filter in filters)
            {
                filter.execute(request);
            }
            target.execute(request);
        }

        public void setTarget(Target target)
        {
            this.target = target;
        }
    }
}

步骤 5-过滤管理器

FilterManager.cs

namespace Intercepting_Filter_Pattern
{
    class FilterManager
    {
        FilterChain filterChain;

        public FilterManager(Target target)
        {
            filterChain = new FilterChain();
            filterChain.setTarget(target);
        }

        public void setFilter(Filter filter)
        {
            filterChain.addFilter(filter);
        }

        public void filterRequest(string request)
        {
            filterChain.execute(request);
        }
    }
}

步骤 6-创建客户端Client

Client.cs

namespace Intercepting_Filter_Pattern
{
    class Client
    {
        FilterManager filterManager;
        public void setFilterManager(FilterManager filterManager)
        {
            this.filterManager = filterManager;
        }

        public void sendRequest(string request)
        {
            filterManager.filterRequest(request);
        }
    }
}

步骤 7-演示

使用 Client 来演示拦截过滤器设计模式。

InterceptingFilterDemo.cs

using System;
namespace Intercepting_Filter_Pattern
{
    class InterceptingFilterDemo
    {
        static void Main(string[] args)
        {
            FilterManager filterManager = new FilterManager(new Target());
            filterManager.setFilter(new AuthenticationFilter());
            filterManager.setFilter(new DebugFilter());

            Client client = new Client();
            client.setFilterManager(filterManager);
            client.sendRequest("HOME");

            Console.Read();
        }
    }
}

步骤 8-验证输出

Authenticating request: HOME
request log: HOME
Executing request: HOME


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值