最近有一个需求是在一个视频处理项目中对视频使用不同的处理工具进行视频合并,模板合成等操作。之前写了一大堆逻辑在一个类中,使用很多的if语句进行逻辑判断处理,虽然也将代码按功能拆分出了很多的方法,但在一个类中还是显得杂乱冗余,之后如果再添加新的工具或者操作时,也不太好拓展与维护,所以后面研究了下工厂,策略,模板模式,将代码进行了重构,整个代码变得简洁了很多。
先使用策略模式将不同的操作下发到对应的plugin中
定义一个总的plugin接口 AbstractPlugin
public interface AbstractPlugin {
public String getType();
public void doProcess();
}
定义一个获取plugin的context类
@Component
public class PluginContext {
@Autowired
private static Map<String, AbstractPlugin> abstractPluginMap;
public PluginContext(AbstractPlugin abstractPlugin) {
this.abstractPluginMap.put(abstractPlugin.getType(), abstractPlugin);
}
public static AbstractPlugin getAbstractPlugin(String type) {
return abstractPluginMap.get(type);
}
}
定义多个子类
public class APlugin implements AbstractPlugin {
@Override
public String getType() {
return "a";
}
@Override
public void doProcess() {
// TODO
}
}
public class BPlugin implements AbstractPlugin {
@Override
public String getType() {
return "b";
}
@Override
public void doProcess() {
// TODO
}
}
使用
AbstractPlugin plugin = PluginContext.getAbstractPlugin("a");
plugin.doProcess();
使用工厂模式
aplugin相当于合并视频的逻辑,bplugin相当于模板视频合成的逻辑,这样是把操作分开了,还需要在美中操作下具体细分使用什么方式,例如使用本地方式和远程方式
将aplugin和bplugin改为abstract抽象类
实现各自的子类
public class NativeAPlugin extends APlugin{
@Override
public String getType() {
return "nativeA";
}
@Override
public void doProcess() {
//TODO
}
}
public class RemoteAPlugin extends APlugin{
@Override
public String getType() {
return "remoteA";
}
@Override
public void doProcess() {
//TODO
}
}
public class NativeBPlugin extends APlugin{
@Override
public String getType() {
return "nativeB";
}
@Override
public void doProcess() {
//TODO
}
}
public class RemoteBPlugin extends APlugin{
@Override
public String getType() {
return "remoteB";
}
@Override
public void doProcess() {
//TODO
}
}
在配合策略模式在使用时可以根据具体业务使用子类的type获取对应的实现。
使用模板模式
在具体的实现中,各个子类的实现方法内,又很多是相同的逻辑,如初始化对象,打印日志,报错捕捉等,这些方法可以从各个子类方法中抽取出来,这样可以是各个具体的实现只关注自己的业务逻辑。
创建模板类
public abstract class TemplatePlugin {
public void process(){
// 进行方法验证
validate();
// 进行通用类的初始化
// 打印开始日志
// 具体实现
try {
startProcess();
}catch (Exception e){
// 捕捉异常后处理
}
// 打印结束日志
}
private void validate(){
}
protected abstract void startProcess();
}
各子类继承模板类,实现具体的startProcess方法进行具体的业务处理。
经过拆分后,不管是代码阅读还是之后添加删除修改等维护都更加的方便清晰了。