C#设计模式:14.责任链模式 u3d学习总结笔记本

责任链模式(Chain of Responsibility Pattern)

某个请求需要多个对象进行处理,从而避免请求的发送者和接收之间的耦合关系。将这些对象连成一条链子,并沿着这条链子传递该请求,直到有对象处理它为止。

这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

优点: 

1、降低耦合度。它将请求的发送者和接收者解耦。

2、简化了对象。使得对象不需要知道链的结构。

3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。

缺点: 

1、不能保证请求一定被接收。

2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。

3、可能不容易观察运行时的特征,有碍于除错。

抽象审批者:

/// <summary>
/// 抽象审批者
/// </summary>
public abstract class Approver
{
    public Approver approver;

    public Approver SetApprover(Approver approver) { return this.approver = approver; }

    public abstract void Processor(int Num);

}

具体审批者:1

/// <summary>
/// 具体审批者:处理器1
/// </summary>
public class Processor1 : Approver
{
    public override void Processor(int Num)
    {
        if (Num < 10)
        {
            Debug.Log("处理器1:数据:" + Num);
        }
        else if (approver != null)
        {
            approver.Processor(Num);
        }
        else
        {
            Debug.Log("下级为空");
        }
    }
}

具体审批者:2

/// <summary>
/// 具体审批者:处理器2
/// </summary>
public class Processor2 : Approver
{
    public override void Processor(int Num)
    {
        if (Num < 20)
        {
            Debug.Log("处理器2:数据:" + Num);
        }
        else if (approver != null)
        {
            approver.Processor(Num);
        }
        else
        {
            Debug.Log("下级为空");
        }
    }
}

具体审批者:3

/// <summary>
/// 具体审批者:处理器3
/// </summary>
public class Processor3 : Approver
{
    public override void Processor(int Num)
    {
        if (Num < 30)
        {
            Debug.Log("处理器3:数据:" + Num);
        }
        else if (approver != null)
        {
            approver.Processor(Num);
        }
        else
        {
            Debug.Log("下级为空");
        }
    }
}

测试运行:

void Start()
{

    Approver processor1 = new Processor1();

    processor1
    .SetApprover(new Processor2())
    .SetApprover(new Processor3())
    ;

    processor1.Processor(0);
    processor1.Processor(10);
    processor1.Processor(20);
    processor1.Processor(30);

}

结果:

猜你喜欢

转载自blog.csdn.net/qq_40346899/article/details/107565635