性能监控系统中,存在告警模块和报表模块,告警结果和报表结果都需要导出。
由于告警开发进度较快,已经实现了excel导出、csv导出、zip导出功能,现在报表需要excel导出、csv导出、pdf导出功能,该如何做呢?
显然,报表不会重复开发excel导出,csv导出代码,只需要增加pdf导出代码即可,这种情况下使用适配器模式再好不过。
一、 类适配器模式
直接的想法,继承告警导出类,增加pdf导出代码,这也就是类适配器模式。
1、 告警导出类
package com.coshaho.learn.adapter; public class AlarmExporter { public void exportCsv() { System.out.println("Export csv"); } public void exportExcel() { System.out.println("Export excel"); } public void exportZip() { System.out.println("Export zip"); } }
2、 导出接口
package com.coshaho.learn.adapter; /** * * IExporter.java Create on 2017年6月7日 下午11:25:44 * * 类功能说明: 导出接口 * * Copyright: Copyright(c) 2013 * Company: COSHAHO * @Version 1.0 * @Author coshaho */ public interface IExporter { public void exportCsv(); public void exportExcel(); public void exportPdf(); }
3、 报表导出类
package com.coshaho.learn.adapter; public class ReportExporter extends AlarmExporter implements IExporter { public void exportPdf() { System.out.println("Export pdf"); } }
二、 对象适配器模式
类适配器模式可以支持报表导出功能的实现,但明眼的读者可以看出来,报表根本不需要zip导出功能,但它却有ziip导出方法,如果后面有新的开发者使用报表zip导出方法,可能会直接报错。针对这种情况,使用对象适配器模式就更胜一筹了。
我们的性能管理系统中,Dashboard也需要支持excel、csv、pdf导出,我们采用对象适配器模式实现。
4、 Dashboard导出类
package com.coshaho.learn.adapter; public class DashboardExporter implements IExporter { private AlarmExporter alarmExporter; public void exportCsv() { alarmExporter.exportCsv(); } public void exportExcel() { alarmExporter.exportExcel(); } public void exportPdf() { System.out.println("Export pdf"); } public DashboardExporter() { this.alarmExporter = new AlarmExporter(); } }
三、 接口适配器模式
性能系统中,流程管理模块只需要支持pdf导出(流程图导出),但是又想使用系统统一的导出接口,此时应该使用接口适配器模式。
我们可以写一个抽象导出类继承导出接口,导出方法实现都为空,各模块继承抽象导出类,只实现自己想要的导出方法即可。
4、 抽象导出类
package com.coshaho.learn.adapter; public abstract class AbstractExporter implements IExporter { public void exportCsv() { } public void exportExcel() { } public void exportPdf() { } }
5、 流程导出类
package com.coshaho.learn.adapter; public class ProcessExporter extends AbstractExporter { public void exportPdf() { System.out.println("Export pdf"); } }
实际应用中,不要过多使用适配器模式,这样可能造成代码结构混乱,必要的时候可以重构代码使其更加通用。
总体来说,对象适配器模式优于类适配器模式,对象适配器模式也是多个其他设计模式的基础。
接口适配器模式更加适合于工具类或者开源底层jar包的开发。
时间: 2024-10-07 22:12:54