java设计模式11: 责任链模式+模板模式

1,什么是: 责任链?  链表式轮询机制==>询问a ( a-->询问b (b-->询问c  (...

2,java 如何模拟: 此机制?===>类似log4j 日志打印体系,如:debug,error,info等级别,

若指定打印级别: error,  可打印info, debug, error

若指定级别为:debug, 可打印info ,debug

若指定级别: info,  可打印info

经分析,于是,得到初步思路:

由上图可知,每个子类都会有重复动作: 判断自己的level 是否小于给定的值, 

于是在父类中再次进行集中实现( 并且, 把常量抽取到接口中,定义新的抽象方法 )得到下图:

 

具体代码如下:

定义:接口+父类=============================

public interface Write {
	//常量
	 int info=1;
	 int warn=2;
	 int err=3;
	
	//方法
	void write();
}
/**
 * 抽象父类: 集中(定义方法, 属性)
 * @author wang
 *
 */
public abstract class AbstractLogger implements Write {
	//属性
	int level;
	AbstractLogger logger;
	
	//构造
	public AbstractLogger(int level) {
		this.level = level;
	}
	public AbstractLogger(int level, AbstractLogger logger) {
		this.level = level;
		this.logger = logger;
	}
	
	//模板方法, 供外界调用
	public void log(int level) {
		//责任:日志打印
		if(this.level<=level) {
			this.write();
		}
		//责任链
		if(logger!=null) {
			logger.log(level);//传递任务
		}
	}
}

定义:子类=================================

public class ErrorLogger extends AbstractLogger{
	//构造方法
	public ErrorLogger(int level) {
		super(level);
	}
	public ErrorLogger(int level, AbstractLogger logger) {
		super(level, logger);
	}

	@Override
	public void write() {
		System.out.println("error  #level......");
	}
}
public class InfoLogger extends AbstractLogger {
	//构造方法
	public InfoLogger(int level) {
		super(level);
	}
	public InfoLogger(int level, AbstractLogger logger) {
		super(level, logger);
	}
	

	@Override
	public void write() {
		System.out.println("info  #level......");
	}
}
public class warnLogger extends AbstractLogger{
	//构造方法
	public warnLogger(int level) {
		super(level);
	}
	public warnLogger(int level, AbstractLogger logger) {
		super(level, logger);
	}
	

	@Override
	public void write() {
		System.out.println("warning  #level......");
	}
}

测试类===================================

public class Test {
	public static void main(String[] args) {
		//创建: 责任链条--->多个对象的链表
		AbstractLogger foot = new ErrorLogger(Write.err);
		AbstractLogger body = new InfoLogger( Write.info, foot);
		AbstractLogger head = new warnLogger(Write.warn,  body);
		
		//调用方法
		System.out.println("======err level=======");
		head.log(AbstractLogger.err);
		System.out.println();
		
		System.out.println("======warn level=======");
		head.log(AbstractLogger.warn);
		System.out.println();
		
		System.out.println("=====info  level========");
		head.log(AbstractLogger.info);
	}
}

测试结果截图如下
   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值