一、行为型设计模式
上篇,我们呢讲解了结构型设计模式,包括 适配器模式、桥接模式、组合模式、装饰者模式、享元模式、代理模式、外观模式。
适配器、桥接、组合、享元: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等,指定不同的级别打印的日志存储的文件是不同的,这种场景就可以使用责任链设计模式来设计解决。
下面使用程序演示下上面的例子:
- 定义日志接口
public interface LoggerInterFace {
//指定下一个目标
void setNextLogger(LoggerInterFace nextLogger);
//打印日志
void logMessage(int level, String message);
//日志格式
void writeFormat(String message);
}
- 定义日志抽象模板
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);
}
}
}
- 定义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());
}
}
- 定义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());
}
}
- 定义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());
}
}
- 定义日志工厂,定义责任链的顺序
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);
}
}
- 演示
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, " 打印错误日志");
}
}