职责链模式学习总结

目录

 

职责链模式

引言

定义

模式类图

实例

实例描述

实例类图

代码实现

模式扩展

纯与不纯的职责链模式

总结

模式优点

模式缺点 


职责链模式

引言

在很多情况下,可以处理某个请求的对象不止一个,这些处理请求的对象可以构成一条链,请求按照这条链传递,这条链就称为职责链。职责链可以是一个条直线,一个环或者树形结构,最常见的职责链是直线型。

定义

英文定义:"Avoid coupling the sender of a request to its recever by giving more than one object to handle the request. Chain the receiving objects and pass the request along the chain until an object handle it."。

中文定义:避免请求发送者与接收者耦合再一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

职责链模式重要等级★★☆☆☆        职责链模式难度等级★★★☆☆

模式类图

实例

实例描述

在军队中,一般根据战争规模的大小和重要性不同由不同级别的长官(Officer)来下达作战命令,情报人英向上级递交军情(如敌人的数量),作战命令需要上级批准,如果直接上级不具备下达命令的权力,则上级又传给上级,直到有人可以决定为止。用职责链模式模拟该过程:

(1)敌人数量<10,班长下达作战命令。

(2)10<=敌人数量<50,排长下达作战命令。

(3)50<=敌人数量<200,营长下达作战命令。

(4)敌人数量>=200,需要开会讨论再下达作战命令。

实例类图

代码实现

Officer长官类,该类定义为抽象类,提供一个模板方法Command(),并且提供一个抽象方法HandleRequest(),子类实现该方法处理请求,定义虚方法Forward(),默认将请求转发给长官,用户也可以重新子类方法实现其他的转发逻辑。定义Hook()钩子方法,用于判断是处理请求,还是转发给长官。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


abstract class Officer
{
    protected Officer officer;

    private string name;
    public Officer(Officer officer)
    {
        this.officer = officer;
    }

    public string Name
    {
        get
        {
            return name;
        }

        set
        {
            name = value;
        }
    }

    public void Command(int enemyNumber)
    {
        if (Hook(enemyNumber))
        {
            HandleRequest(enemyNumber);
            Console.WriteLine();
        }
        else
            ForwardRequest(enemyNumber);
    }

    protected abstract bool Hook(int enemyNumber);

    public abstract void HandleRequest(int enemyNumber);

    public virtual void ForwardRequest(int enemyNumber)
    {
        Console.WriteLine("{0}向长官{1}传达战报,",Name,officer.Name);
        officer.Command(enemyNumber);
    }  
}

Banzhang班长类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


class Banzhang : Officer
{
    public Banzhang(Officer officer) : base(officer) { }

    public override void HandleRequest(int enemyNumber)
    {
        Console.WriteLine("班长{0}下令痛击{1}个敌人", Name, enemyNumber);
    }

    protected override bool Hook(int enemyNumber)
    {
        return enemyNumber < 10;
    }
}

Paizhang排长类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Paizhang : Officer
{
    public Paizhang(Officer officer) : base(officer) { }

    public override void HandleRequest(int enemyNumber)
    {
        Console.WriteLine("排长{0}下令痛击{1}个敌人", Name, enemyNumber);
    }

    protected override bool Hook(int enemyNumber)
    {
        return 10 <= enemyNumber && enemyNumber < 50;
    }
}

Yingzhang营长类 ,由于该情景中营长为最高级长官,所以重写Forward方法,不再转发给上级。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Yingzhang : Officer
{
    public Yingzhang(Officer officer):base(officer) { }

    public override void HandleRequest(int enemyNumber)
    {
        Console.WriteLine("营长{0}下令痛击{1}个敌人", Name, enemyNumber);
    }

    protected override bool Hook(int enemyNumber)
    {
        return 50 <= enemyNumber && enemyNumber < 200;
    }

    public override void ForwardRequest(int enemyNumber)
    {
        Console.WriteLine("敌人有{0},{1}召开作战会议!",enemyNumber,Name);
        //base.ForwardRequest(enemyNumber);
    }
}

测试代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Officer p1, p2, p3;
        p1 = new Yingzhang(null);
        p1.Name = "李云龙";
        p2 = new Paizhang(p1);
        p2.Name = "楚云飞";
        p3 = new Banzhang(p2);
        p3.Name = "和尚";

        p3.Command(5);
        p3.Command(30);
        p3.Command(111);
        p3.Command(666);

        Console.ReadKey();
    }
}

运行结果

 

模式扩展

纯与不纯的职责链模式

一个纯的职责链模式要求一个具体处理者对象只能在俩个行为中选择一个:一个是承担责任,一人是把责任推给下家。不允许出现一个具体处理者对象在承担了一部分责任后又将责任向下传的情况。

总结

模式优点

1.降低耦合度:职责链模式使得一个对象无需知道是其他那个对象处理其请求。对象仅需知道该请求会被处理即可。接收者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构,由客户端负责链的创建。

2.可以简化对象之间的互相连接:请求处理对象只需要维持一个指向其后继者的引用,而不需要维持它对所有候选处理者的引用。

3.职责链中新增一个请求处理者类非常容易,无需修改已有代码,且客户端重新建链即可使用。符合”开闭原则“

模式缺点 

1.不能保证请求一定被处理,因为没有明确的接收者,可能链的最末端都不处理该请求。一个请求也可能因为职责链没有真正确配置而得不到处理。

2.对于较长的链,系统需要创建多个处理对象,而实际处理的对象只有一个,这在一定程度上是浪费了内存,影响了系统性能。且调试这种长链代码可能会很麻烦。

3.职责链如果建立不当,特别是环型链,可能会导致循环调用,系统陷入死循环。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值