JAVA中接口和抽象类的妙用-我自己也不知道这个是什么设计模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tjzhuorui/article/details/68064232

抽象类写流程,接口规定必须实现的行为

首先我有一个这样的需求,有一个接收数据的程序,有多种报文格式,且每一种报文对应一个handler(这个报文的处理类),当有新的报文来临,程序判断由哪种handler来处理,且创建对应handler的示例,调用handler的handle方法。

进入handle方法,基本每个报文处理者,都需要进行如下操作:

起初笔者没有什么经验,直接在每个handler的handle方法进行代码,后来发现考虑到要代码好看一点,代码中分出一块save()方法,用于存储数据库。这样对于我自己一个人来开发没有任何问题。

但是现在我的这个程序有新的需求,增加了许多种报文格式,这就意味着,需要更多报文处理者。

显然,我一个人已经不能完成这个工作了,当多人写代码的时候,我又想控制他们的流程,就如同上面的的流程图,他们需要做的,只是去实现每个模块里面的代码部分:

开篇笔者不是说,抽象类写流程,接口规定必须实现的行为:

所有的handler都必须继承抽象类BaseHandler,抽象类BaseHandler也是一种handler,也需要实现接口handle方法,且在BaseHandler中将handle方法设置为final

接口IHandler

public interface IHandler {
	public void handle();

	/**
	 * 打印
	 */
	public void print();

	/**
	 * 解析报文
	 */
	public void doMsg();

	/**
	 * 入库
	 */
	public void save();

	/**
	 * 回复
	 */
	public void doResp();

}

抽象类BaseHandler:

public abstract class BaseHandler implements IHandler {
	@Override
	final public void handle() {// 实现了流程的控制
		print();
		doMsg();
		save();
		doResp();
	}
}

实现类A:

public class AHandler extends BaseHandler implements IHandler {
	@Override
	public void print() {
		System.out.println("A的print");
	}

	@Override
	public void doMsg() {
		System.out.println("A的doMsg");
	}

	@Override
	public void save() {
		System.out.println("A的save");

	}

	@Override
	public void doResp() {
		System.out.println("A的doResp");

	}
}

实现类B:

public class BHandler extends BaseHandler {

	@Override
	public void print() {
		System.out.println("B的print");
	}

	@Override
	public void doMsg() {
		System.out.println("B的doMsg");
	}

	@Override
	public void save() {
		System.out.println("B的save");

	}

	@Override
	public void doResp() {
		System.out.println("B的doResp");

	}

}

然后是测试类:

	public static void main(String[] args) {
		// 收到报文信息
		// 判断是AHandler
		IHandler aHandler = new AHandler();
		aHandler.handle();
		System.out.println("----------------");

		// 有收到一条报文
		// 判断是BHandler
		IHandler bHandler = new BHandler();
		bHandler.handle();
	}

得到输出结果:

A的print
A的doMsg
A的save
A的doResp
----------------
B的print
B的doMsg
B的save
B的doResp


这样就是实现了,这种方式很多好处:

1由设计者来控制流程,开发者实现各个模块的细节。分工明确;

2如果突然有一天,我需要变化一下流程,比如我要先doResp再print再doMsg再save(当然,此例子并不合适),我只需要变动BaseHandler,其他代码都不需要进行变更;

3在BaseHandler的handle()中,我还可以写入很多公共的东西,比如是日志记录,甚至,如果print()每个handler的实现都一致的话,我完全可以在BaseHandler里面去完成,继承类A和B就完全不用考虑。

但是有一个问题,仔细看A和B的extends和implement部分,这种设计模式,要求开发者必须extends BaseHandler


小结.接口定义了5中行为,handle,print,doMsg,save,doResp。抽象类实现了接口handle,并在handle中制定了流程,具体的实现这extends抽象类。收工.









阅读更多

没有更多推荐了,返回首页