需求:
项目需要对银行报文进行解析,而对应的银行有多家,后续可能有更多的银行接入,要求尽可能不要对原有代码的更改。
很自然的想到工厂模式。
1.定义顶层解析接口
2.定义顶层提供者接口
3.编写不同的解析器
4.编写不同的解析器工厂类
5.测试
1.定义顶层解析接口
package com.yun.base.design.factory.service; import java.io.InputStream; public interface IParser { /** * 解析器解析方法,将输入流解析为可识别的对象 * @param in * @param target */ void parse(InputStream in,Object target); }
2.定义顶层提供者接口
package com.yun.base.design.factory.service; public interface IProvider { /** * 解析器工厂类,专供生产解析器 * @return */ IParser produce(); }
3.编写不同的解析器
package com.yun.base.design.factory.service.impl; import java.io.InputStream; import com.yun.base.design.factory.service.IParser; public class Dom4jParser implements IParser { @Override public void parse(InputStream in, Object target) { System.out.println("Dom4j解析报文"); } }
package com.yun.base.design.factory.service.impl; import java.io.InputStream; import com.yun.base.design.factory.service.IParser; public class SaxParser implements IParser { @Override public void parse(InputStream in, Object target) { System.out.println("Sax解析器解析报文"); } }
4.编写不同的解析器工厂类
package com.yun.base.design.factory.service.impl; import com.yun.base.design.factory.service.IParser; import com.yun.base.design.factory.service.IProvider; public class Dom4jProvider implements IProvider{ @Override public IParser produce() { return new Dom4jParser(); } }
5.测试
@Test public void test() { IParser dom4jParser = new Dom4jProvider().produce(); IParser saxParser = new SaxProvider().produce(); dom4jParser.parse(null, null); saxParser.parse(null, null); }
结果
Dom4j解析报文
Sax解析器解析报文
如果需要增加不同的解析方法,那么只需要实现顶层解析接口,实现工厂类接口,对原有接口及工厂类没有改动。