设计模式(13)——责任链(Chain of Responsibility)

责任链是什么?

责任链条模式使多个对象都有机会处理请求。打个比方说,责任就是得分,多个对象就是篮球队员,在三分线的远投的时候,球由投手投篮。带球突破则由后卫负责。。。

责任链模式的适用范围

1. 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2. 在不明确指定接收者的情况下向多个对象中的一个提交一个请求。
3. 可处理的一个请求对象集合应被动态指定。

责任链模式的例子

abstract class Logger {
    public static int ERR = 3;
    public static int NOTICE = 5;
    public static int DEBUG = 7;
    private int mask;
 
    // The next element in the chain of responsibility
    private Logger next;
 
    public Logger(int mask) {
        this.mask = mask;
    }
 
    public void setNext(Logger logger) {
        next = logger;
    }
 
    public void message(String msg, int priority) {
        if (priority <= mask) {
            writeMessage(msg);
        }
        if (next != null) {
            next.message(msg, priority);
        }
    }
 
    abstract protected void writeMessage(String msg);
}
 
class StdoutLogger extends Logger {
    public StdoutLogger(int mask) {
        super(mask);
    }
 
    protected void writeMessage(String msg) {
        System.out.println("Writing to stdout: " + msg);
    }
}
 
class EmailLogger extends Logger {
    public EmailLogger(int mask) {
        super(mask);
    }
 
    protected void writeMessage(String msg) {
        System.out.println("Sending via e-mail: " + msg);
    }
}
 
class StderrLogger extends Logger {
    public StderrLogger(int mask) {
        super(mask);
    }
 
    protected void writeMessage(String msg) {
        System.err.println("Sending to stderr: " + msg);
    }
}
 
public class ChainOfResponsibilityExample {
 
    private static Logger createChain() {
        // Build the chain of responsibility
 
        Logger logger = new StdoutLogger(Logger.DEBUG);
 
        Logger logger1 = new EmailLogger(Logger.NOTICE);
        logger.setNext(logger1);
 
        Logger logger2 = new StderrLogger(Logger.ERR);
        logger1.setNext(logger2);
 
        return logger;
    }
 
    public static void main(String[] args) {
        Logger chain = createChain();
 
        // Handled by StdoutLogger (level = 7)
        chain.message("Entering function y.", Logger.DEBUG);
 
        // Handled by StdoutLogger and EmailLogger (level = 5)
        chain.message("Step1 completed.", Logger.NOTICE);
 
        // Handled by all three loggers (level = 3)
        chain.message("An error has occurred.", Logger.ERR);
    }
}
/*
The output is:
   Writing to stdout:   Entering function y.
   Writing to stdout:   Step1 completed.
   Sending via e-mail:  Step1 completed.
   Writing to stdout:   An error has occurred.
   Sending via e-mail:  An error has occurred.
   Sending to stderr:   An error has occurred.
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值