设计模式——责任链模式(一文看懂)

设计模式分为创建型、结构型、行为型。责任链模式作为行为型模式之一,用于解耦请求的发送者和接收者。通过示例说明,小明寻找人资部长的过程,展示了如何通过责任链模式将请求传递给合适处理者,降低了耦合性。文章进一步以计算器四则运算为例,阐述了责任链模式的应用,并展示了类图结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式主要分为创建型、结构型、行为型
其中创建型包括单例模式、抽象工厂、工厂方法、建造模式、原型模式模式。
结构型模式包括适配器、桥接、组合、装饰者、外观、代理模式。
行为型包括迭代器、观察者、模板方法、责任链、命令、策略模式。
责任链模式是行为型模式的一种:

不同类型的模式的区别见下图:

进入正题:
假设现在存在这样一个问题,小明想要去跟人力资源部长谈事情,但他并不知道哪个才是自己要找的人,他有三个候选对象分布在不同的地方,他就需要对每个人都发出一次请求(询问对方是否是人资部长)这样一来,命令发送者与接收者之间就有强耦合关系。

而责任链这个设计模式就是希望使得多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。
在这里插入图片描述
在上面的例子中也就是这样一个情况,小明先找到候选人A,发出请求,如果A不是,A正好有B的电话,就将请求转移给B,如果B也不是,那他就打电话给C,将请求转移给C。

我们通过这个想法就能设计出类图来:
在这里插入图片描述
successor就是继任人,handle()就是判断自己能否接下这件事。但这个类图还存在一些问题,如果我们此时又多了一个候选人D,并且改变了他们之间的继任顺序,那么需要改动的代码就大大增加了。

因此我们用一个抽象类,将successor和handle放入父类,候选人只需要继承实现就行了。
在这里插入图片描述
举例1.计算器的四则运算
在这里插入图片描述
我们让程序去判断输入的运算符是否是+,若不是则判断是否是-,若不是则判断是否是*,若不是则判断是否是/,若都不是抛出异常警告。
在这里插入图片描述
画出类图:
在这里插入图片描述
CalcUnit:

package Res;

import javax.naming.OperationNotSupportedException;

public abstract class CalcUnit {
    private CalcUnit next;
    public CalcUnit(CalcUnit next)
    {
        super();
        this.next=next;
    }
    public CalcUnit(){}
    public  CalcUnit getNext()
    {
        return next;
    }
    public void setNext(CalcUnit next)
    {
        this.next=next;
    }
    public   double calc(double x,double y,String operator) throws OperationNotSupportedException
    {
        if(this.getNext()!=null)
        {return  this.getNext().calc(x,y,operator);}
        else
        {
            throw  new  OperationNotSupportedException(operator+"not found!");
        }

    }
    }


Add

package Res;

import javax.naming.OperationNotSupportedException;

public class Add extends CalcUnit {
    public Add(CalcUnit c) {
        super(c);
    }

    @Override
    public double calc(double x, double y, String operator) throws OperationNotSupportedException {
        if (operator.equals("+")) {
            return x + y;
        } else {
            return  super.calc(x, y, operator);

        }
    }
}




Sub:

package Res;

import javax.naming.OperationNotSupportedException;

public class Sub extends CalcUnit {
    public Sub(CalcUnit c) {
        super(c);
    }

    public double calc(double x, double y, String operator) throws OperationNotSupportedException {
        if (operator.equals("-")) {
            return x - y;
        } else {
            return  super.calc(x, y, operator);

        }
    }
}

Mul:

package Res;

import javax.naming.OperationNotSupportedException;

public class Mul extends CalcUnit {
    public Mul(CalcUnit c) {
        super(c);
    }

    public double calc(double x, double y, String operator) throws OperationNotSupportedException {
        if (operator.equals("*")) {
            return x * y;
        } else {
            return  super.calc(x, y, operator);

        }
    }
}

Div:

package Res;

import javax.naming.OperationNotSupportedException;

public class Div extends CalcUnit{
    public double calc(double x, double y, String operator) throws OperationNotSupportedException {
        if (operator.equals("/")) {
            return x / y;
        } else {
            return  super.calc(x, y, operator);

        }
    }
}

Test:

package Res;

import javax.naming.OperationNotSupportedException;

public class Test {
    public static void main(String args[])
    {
        CalcUnit c=new Add(new Sub(new Mul(new Div())));
        try{
            System.out.println(c.calc(3,5,"!"));

        }catch (OperationNotSupportedException e)
        {
            e.printStackTrace();
        }

    }
}

输出结果(因为输入的是!,所以返回异常):
在这里插入图片描述
这是一种责任链模式(纯链式),还有非纯链式
在这里插入图片描述
也就是类似于流程图,不做判断,每个模块都需要执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值