设计模式——职责链模式

初识

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一个链,并沿着这条链传递该请求,直到有一个对象处理它为止。

结构

在这里插入图片描述
角色:

Handler类:定义一个处理请示的接口
ConcreteHandler类:处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给它的后继者

实现

在我们身边类似于职责链模式的有很多。在我们学习的过程中,遇到问题的话,首先,要解决肯定要先靠自己,通过自己思考去尝试解决;解决不了可以站在巨人肩膀上,利用搜索引擎等一系列办法;如果还解决不了,可以请教他人。
这其实就是一条职责链,沿着这条链将问题进行传递,直到有一个办法可以将它解决为止。下面看看如何实现这个职责链。

在这里插入图片描述

class Program
{
    static void Main(string[] args)
    {
        Yourself jiji = new Yourself("寄几");
        Search shousuo = new Search("瘦琐");
        Ask qinjiao = new Ask("秦叫");

        jiji.SetSuperior(shousuo);
        shousuo.SetSuperior(qinjiao);

        Solve solve = new Solve();
        solve.SolveType = "生活";
        solve.SolveContent = "早起";
        jiji.SolveApplications(solve);


        Solve solve1 = new Solve();
        solve1.SolveType = "学习";
        solve1.SolveContent = "学习设计模式";
        jiji.SolveApplications(solve1);

        Solve solve2 = new Solve();
        solve2.SolveType = "交流";
        solve2.SolveContent = "同学间交流";
        jiji.SolveApplications(solve2);

        Console.Read();
    }
}

class Solve
{
    private string solvetype;

    public string SolveType
    {
        get { return solvetype; }
        set { solvetype= value; }
    }

    private string solvecontent;

    public string SolveContent
    {
        get { return solvecontent; }
        set { solvecontent= value; }
    }
}

abstract class Way//解决方法类
{
    protected string name;

    protected Way superior;

    public Way(string name)
    {
        this.name = name;
    }

    public void SetSuperior(Way superior)
    {
        this.superior = superior;
    }

    abstract public void SolveApplications(Solve solve);
}

class Yourself: Way//自己类
{
    public Yourself(string name) : base(name)
    {

    }

    public override void SolveApplications(Solve solve)
    {
        if (solve.SolveType == "生活")
        {
            Console.WriteLine("{0}:解决{1}问题", name, solve.SolveContent);
        }
        else
        {
            if (superior!= null)
            {
                superior.SolveApplications(solve);
            }
        }
    }
}

class Search: Way//搜索类
{
    public Search(string name):base(name)
    {

    }

    public override void SolveApplications(Solve solve)
    {
        if (solve.SolveType == "学习")
        {
            Console.WriteLine("{0}:解决{1}问题", name, solve.SolveContent);
            
        }
        else
        {
            if (superior!=null)
            {
                superior.SolveApplications(solve);
            }
        }
    }
}

class Ask: Way//请教类
{
    public Ask(string name):base(name)
    {

    }
    public override void SolveApplications(Solve solve)
    {
        if (solve.SolveType == "交流")
        {
            Console.WriteLine("{0}:解决{1}问题", name, solve.SolveContent);
        }
        else
        {
            if (superior!=null)
            {
                superior.SolveApplications(solve);
            }
        }
    }
}

运行结果:
在这里插入图片描述

优点

  • 接受者和发送者都没有对方的明确信息,且链中的对象也并不知道链的结构,结果是责任链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选继承者,大大的降低了耦合度。
    请求者不用管具体哪个对象会处理,反正该请求肯定会被处理就行了
  • 可以随时增加或者修改处理一个请求的结构,增加了给对象指派职责的灵活性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值