设计模式之责任链模式

举报
chenyu 发表于 2021/07/27 00:40:29 2021/07/27
【摘要】 1 责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。   ...

1 责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推

 

 

 

 

 

 

2 优点和缺点

职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了

 

 

 

 

 

 

3 测试Demo类图

我们创建抽象类 AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器

 

 

 

 

4 代码实现

1) AbstractLogger.java


  
  1. public abstract class AbstractLogger {
  2. public static int INFO = 1;
  3. public static int DEBUG = 2;
  4. public static int ERROR = 3;
  5. protected int level;
  6. //责任链中的下一个元素
  7. protected AbstractLogger nextLogger;
  8. public void setNextLogger(AbstractLogger nextLogger){
  9. this.nextLogger = nextLogger;
  10. }
  11. public void logMessage(int level, String message){
  12. if(this.level <= level){
  13. write(message);
  14. }
  15. if(nextLogger !=null){
  16. nextLogger.logMessage(level, message);
  17. }
  18. }
  19. abstract protected void write(String message);
  20. }

 

 

2)ConsoleLogger.java


  
  1. public class ConsoleLogger extends AbstractLogger {
  2. public ConsoleLogger(int level){
  3. this.level = level;
  4. }
  5. @Override
  6. protected void write(String message) {
  7. System.out.println("Standard Console::Logger: " + message);
  8. }
  9. }

 

3)ErrorLogger.java


  
  1. public class ErrorLogger extends AbstractLogger {
  2. public ErrorLogger(int level){
  3. this.level = level;
  4. }
  5. @Override
  6. protected void write(String message) {
  7. System.out.println("Error Console::Logger: " + message);
  8. }
  9. }

 

4)FileLogger.java


  
  1. public class FileLogger extends AbstractLogger {
  2. public FileLogger(int level){
  3. this.level = level;
  4. }
  5. @Override
  6. protected void write(String message) {
  7. System.out.println("File::Logger: " + message);
  8. }
  9. }

 

5) ChainPatternDemo.java


  
  1. public class ChainPatternDemo {
  2. private static AbstractLogger getChainOfLoggers(){
  3. AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
  4. AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
  5. AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
  6. errorLogger.setNextLogger(fileLogger);
  7. fileLogger.setNextLogger(consoleLogger);
  8. return errorLogger;
  9. }
  10. public static void main(String[] args) {
  11. AbstractLogger loggerChain = getChainOfLoggers();
  12. loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
  13. loggerChain.logMessage(AbstractLogger.DEBUG,
  14. "This is a debug level information.");
  15. loggerChain.logMessage(AbstractLogger.ERROR,
  16. "This is an error information.");
  17. }
  18. }

 

 

 

5 运行结果


  
  1. Standard Console::Logger: This is an information.
  2. File::Logger: This is a debug level information.
  3. Standard Console::Logger: This is a debug level information.
  4. Error Console::Logger: This is an error information.
  5. File::Logger: This is an error information.
  6. Standard Console::Logger: This is an error information.

参考地址:https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html 

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/103414712

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。