现在的位置: 首页 > 综合 > 正文

设计模式之责任链模式

2014年09月05日 ⁄ 综合 ⁄ 共 1648字 ⁄ 字号 评论关闭

今天写的一个程序有个一功能是检查一个数据包中的数据是否有问题,因为问题可能有多种,所以想到了责任链模式。。。

责任链模式生动一点就像是我写了一个报告,然后上交给我的组长,组长批阅之后交给科长,科长给部长,部长给经理。。。这样一层层处理的关系

说下具体的。。。

责任链模式的结构比较简单:

一个抽象负责人类,一般都是抽象类。作为所有负责人的公共父类,里面有一个protected字段,指向下一个负责人,一个抽象方法,用来检查

还有就是继承基类的具体负责人类,根据自身的责任不同来重写Handler方法,然后设置下一个具体负责任人的方法(我写在构造函数里面了。。。)

就像是这个样子。。。

using System;
using System.Configuration;
using System.Collections;

public class TestDatebase
{
    
    public static void Main(string[] args)
    {
        ConcreteHandler1 c1 = new ConcreteHandler1(null);
        ConcreteHandler2 c2 = new ConcreteHandler2(c1);
        c2.Handler(-1);
    }
}
public abstract class AbstractHandler
{
    protected AbstractHandler NextHandler;
    public abstract void Handler(int x);
}
public class ConcreteHandler1:AbstractHandler
{
    public ConcreteHandler1(AbstractHandler NextHandler)
    {
        this.NextHandler = NextHandler;
    }
    public override void Handler(int x)
    {
        if (x<0)
            Console.WriteLine("ConcreteHandler1 is Working");
        else 
            if (NextHandler != null) NextHandler.Handler(x);
    }
}
public class ConcreteHandler2 : AbstractHandler
{
    public ConcreteHandler2(AbstractHandler NextHandler)
    {
        this.NextHandler = NextHandler;
    }
    public override void Handler(int x)
    {
        if (x>=0) 
            Console.WriteLine("ConcreteHandler2 is Working");
        else 
            if (NextHandler != null) NextHandler.Handler(x);
    }
}

上面就是一个最简单的责任链模式代码,一定要注意的是别忘了在处理方法(也就是上面的Handler方法中)加入对下一个责任人的调用,要不然就不叫链了是不是~

对于链的形成。。。我上面是在主函数中做的,就是把下一个责任人的引用传到构造函数中。当然,也可以新定义一个类,用来封装所有责任人的对象,然后调用那个新的类的一个方法来使用责任链,这样避免了在责任链被多次使用时还要重新new的尴尬-_-||

上面的责任链属于纯责任链模式,因为一个责任人要么处理信息,要么传给下一家。

而不纯的责任链模式则是一个责任人既可以先处理信息然后传给下家,这个的缺点就是,我们不知道这个信息是否被处理过,因为在纯责任链中,如果最后一个责任人继续传给下一个(实际上已经没有了)我们就可以知道,这个信息没有被处理过,而不纯的责任链模式则看不出来-_-||

PS:责任链不一定是链,因为NextHandler也可以是一个数组-_-||

优点嘛。。。降低了耦合度,而且简化了对象之间的相互连接。

缺点也比较明显,不能保证信息被正确的处理,因为责任人顺序的问题,我们不能保证信息会被最适合的那个责任人处理,而且连接不当可能会造成死循环,链太长调试起来也比较费劲>.<

抱歉!评论已关闭.