设计模式-行为型模式讲解一(责任链、命令、迭代器)

一、行为型设计模式

上篇,我们呢讲解了结构型设计模式,包括 适配器模式、桥接模式、组合模式、装饰者模式、享元模式、代理模式、外观模式。

适配器、桥接、组合、享元:https://blog.csdn.net/qq_43692950/article/details/120248267
装饰者、外观、代理:https://blog.csdn.net/qq_43692950/article/details/120249265

这篇文章我们来讲解下行为型设计模式:主要用于描述类或对象之间的交互或职责的分配,为设计类的交互和职责分配做指南。

在本文主要介绍:责任链、命令、迭代器模式。

二、责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

优点是降低了耦合度,它将请求的发送者和接收者解耦。简化了对象,使得对象不需要知道链的结构。 增强给对象指派职责的灵活性,通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 增加新的请求处理类很方便。

举个例子:在平时开发中,我们经常需要打印日志来查看一些信息,但打日志时我们都会指定一个日志级别,比如 INFO、WARN、ERROR等,指定不同的级别打印的日志存储的文件是不同的,这种场景就可以使用责任链设计模式来设计解决。

下面使用程序演示下上面的例子:

  1. 定义日志接口
public interface LoggerInterFace {
    //指定下一个目标
    void setNextLogger(LoggerInterFace nextLogger);
    //打印日志
    void logMessage(int level, String message);
    //日志格式
    void writeFormat(String message);
}
  1. 定义日志抽象模板
public abstract class AbstractLogger implements LoggerInterFace {
    public static int INFO = 1;
    public static int WARN = 2;
    public static int ERROR = 3;

    private int level;
    private LoggerInterFace nextLogger;

    public AbstractLogger(int level) {
        this.level = level;
    }

    @Override
    public void setNextLogger(LoggerInterFace nextLogger) {
        this.nextLogger = nextLogger;
    }

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

}
  1. 定义Info级别的实现
public class InfoLogger extends AbstractLogger {

   public InfoLogger(int level) {
      super(level);
   }

   @Override
   public void writeFormat(String message) {
      System.out.println(StringFormatter.concat(" 普通信息:", message).getValue());
   }

}
  1. 定义Warn级别的实现
public class WarnLogger extends AbstractLogger {

   public WarnLogger(int level) {
      super(level);
   }

   @Override
   public void writeFormat(String message) {
      System.out.println(StringFormatter.concat(" 警告信息:", message).getValue());
   }
}
  1. 定义Error级别的实现
public class ErrorLogger extends AbstractLogger {

    public ErrorLogger(int level) {
        super(level);
    }

    @Override
    public void writeFormat(String message) {
        System.out.println(StringFormatter.concat(" 错误信息:", message).getValue());
    }
}
  1. 定义日志工厂,定义责任链的顺序
public class LoggerFactory {

    public static LoggerInterFace getLogger() {
        //定义责任链的顺序
        List<AbstractLogger> list = new LinkedList<>();
        list.add(new ErrorLogger(AbstractLogger.ERROR));
        list.add(new WarnLogger(AbstractLogger.WARN));
        list.add(new InfoLogger(AbstractLogger.INFO));

        for (int i = 0; i < list.size() - 1; i++) {
            list.get(i).setNextLogger(list.get(i + 1));
        }

        return list.get(0);
    }
}
  1. 演示
public class demo {
    public static void main(String[] args) {
        LoggerInterFace logger = LoggerFactory.getLogger();

        logger.logMessage(AbstractLogger.INFO, " 打印普通日志");

        logger.logMessage(AbstractLogger.WARN, " 打印警告日志");

        logger.logMessage(AbstractLogger.ERROR, " 打印错误日志");
    }
}

设计模式-行为型模式讲解一(责任链、命令、迭代器)

上一篇:设计模式-ChainOfResponsibility责任链


下一篇:Babylon.js 构建 地球,支持切片地图 (二)