本文介绍: 责任模式是一种行为设计模式用于对象间建立一条处理请求的链。它允许多个对象有机会处理请求,从而减少请求发送者接收者之间的耦合。在责任模式中,每个接收者包含对另一个接收者引用,形成一条链。如果一个对象不能处理请求,它会将请求传递给链中的下一个对象,直至链的末端。责任模式多个处理器(或接收者)组成,每个处理器决定自己是否处理请求或将其传递给链上的下一个处理器。这种模式实现发送者接收者之间的解耦,同时允许动态地调整链中的处理器处理器(Handler
定义

责任模式是一种行为设计模式用于对象间建立一条处理请求的链。它允许多个对象有机会处理请求,从而减少请求的发送者接收者之间的耦合。在责任模式中,每个接收者包含对另一个接收者引用,形成一条链。如果一个对象不能处理请求,它会将请求传递给链中的下一个对象,直至链的末端。

责任链模式多个处理器(或接收者)组成,每个处理器决定自己是否处理请求或将其传递给链上的下一个处理器。这种模式实现发送者和接收者之间的解耦,同时允许动态地调整链中的处理器。

责任链模式主要包含以下两个角色

  1. 处理器(Handler
  2. 具体处理器(Concrete Handler
    • 实现处理器接口的具体类。每个具体处理器决定它是否要处理请求,如果不处理,则将请求传递给链中的下一个对象
解决问题
使用场景
  • 多个对象可以处理同一个请求,但具体的处理者在运行时才确定
    • 当一个请求可能由多个不同的对象处理,但是具体由哪个对象处理在运行时才决定时,责任链模式是理想的解决方案
  • 请求的发送者不需要知道是谁处理了请求
    • 如果请求的发送者不需要知道请求最终由哪个对象处理,责任链模式可以将请求的发送和处理解耦。
  • 动态指定一组对象处理请求
  • 实现不同方式的请求处理
    • 在有多种处理方式,并且希望根据请求的类型条件以不同的方式处理时,责任链模式能够提供足够的灵活性。
示例代码1-日志处理器
// 抽象处理器类
public abstract class Logger {
    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;

    protected int level;
    protected Logger nextLogger;

    public void setNextLogger(Logger nextLogger) {
        this.nextLogger = nextLogger;
    }

    public void logMessage(int level, String message) {
        if (this.level <= level) {
            write(message);
        }
        if (nextLogger != null) {
            nextLogger.logMessage(level, message);
        }
    }

    abstract protected void write(String message);
}

// 具体处理器实现
class ConsoleLogger extends Logger {
    public ConsoleLogger(int level) {
        this.level = level;
    }

    @Override
    protected void write(String message) {        
        System.out.println("Standard Console::Logger: " + message);
    }
}

// 客户端使用责任链
public class ChainPatternDemo {
    private static Logger getChainOfLoggers() {
        Logger errorLogger = new ErrorLogger(Logger.ERROR);
        Logger fileLogger = new FileLogger(Logger.DEBUG);
        Logger consoleLogger = new ConsoleLogger(Logger.INFO);

        errorLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(consoleLogger);
        return errorLogger;
    }

    public static void main(String[] args) {
        Logger loggerChain = getChainOfLoggers();

        loggerChain.logMessage(Logger.INFO, "This is an information.");
        loggerChain.logMessage(Logger.DEBUG, "This is a debug level information.");
        loggerChain.logMessage(Logger.ERROR, "This is an error information.");
    }
}
示例代码2-审批流程
// 抽象处理器
abstract class Approver {
    protected Approver successor;

    public void setSuccessor(Approver successor) {
        this.successor = successor;
    }

    public abstract void processRequest(PurchaseRequest request);
}

// 具体处理器:经理
class Manager extends Approver {
    public void processRequest(PurchaseRequest request) {
        if (request.getAmount() < 1000) {
            System.out.println("Manager will approve the request of " + request.getAmount());
        } else if (successor != null) {
            successor.processRequest(request);
        }
    }
}

// 具体处理器:总监
class Director extends Approver {
    public void processRequest(PurchaseRequest request) {
        if (request.getAmount() < 5000) {
            System.out.println("Director will approve the request of " + request.getAmount());
        } else if (successor != null) {
            successor.processRequest(request);
        }
    }
}

// 具体处理器:CEO
class CEO extends Approver {
    public void processRequest(PurchaseRequest request) {
        if (request.getAmount() < 10000) {
            System.out.println("CEO will approve the request of " + request.getAmount());
        } else {
            System.out.println("Request of " + request.getAmount() + " needs a board meeting!");
        }
    }
}

// 请求类
class PurchaseRequest {
    private double amount;

    public PurchaseRequest(double amount) {
        this.amount = amount;
    }

    public double getAmount() {
        return amount;
    }
}

// 客户代码
public class ChainOfResponsibilityDemo {
    public static void main(String[] args) {
        Approver manager = new Manager();
        Approver director = new Director();
        Approver ceo = new CEO();

        manager.setSuccessor(director);
        director.setSuccessor(ceo);

        manager.processRequest(new PurchaseRequest(500));
        manager.processRequest(new PurchaseRequest(1500));
        manager.processRequest(new PurchaseRequest(5500));
    }
}
主要符合的设计原则
在JDK中的应用
在Spring中的应用

原文地址:https://blog.csdn.net/haoxin963/article/details/134572564

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_17629.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注