性能监控系统中,存在告警模块和报表模块,告警结果和报表结果都需要导出。

由于告警开发进度较快,已经实现了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包的开发。

Java设计模式应用——适配器模式的更多相关文章

  1. java设计模式5——适配器模式

    java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ...

  2. Java设计模式之适配器模式(项目升级案例)

    今天是我学习Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一遍 ...

  3. Java设计模式----初识适配器模式

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  4. Java设计模式之适配器模式(Adapter)

    转载:<JAVA与模式>之适配器模式 这个总结的挺好的,为了加深印象,我自己再尝试总结一下 1.定义: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法 ...

  5. Java设计模式中适配器模式的实现方法

    在Java开发中,我们常常需要用到Java接口型模式中的适配器模式,那适配器设计模式到底是什么模式呢? 适配器模式(Adapter)就是把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹 ...

  6. 夜话JAVA设计模式之适配器模式(adapter pattern)

    适配器模式:将一个类的接口,转换成客户期望的另一个接口,让不兼容的接口变成兼容. 1.类适配器模式:通过多重继承来实现适配器功能.多重继承就是先继承要转换的实现类,再实现被转换的接口. 2.对象适配器 ...

  7. java设计模式之适配器模式

    说到适配器,我们可能会想到电脑的适配器,没错,其实作用是一样的,电脑的适配器在中国可以使用,在美国也可以使用,它的主要作用是在新接口和老接口之间进行适配..这就是一个适配的过程,适配器模式的类图如下: ...

  8. java设计模式之——适配器模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极.阴极 ...

  9. java设计模式之六适配器模式(Adapter)

    适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...

随机推荐

  1. 【CF736D】Permutations 线性代数+高斯消元

    [CF736D]Permutations 题意:有一个未知长度为n的排列和m个条件,第i个条件$(a_i,b_i)$表示第$a_i$个位置上的数可以为$b_i$.保证最终合法的排列的个数是奇数.现在有 ...

  2. centos7搭建docker私有仓库

    1.环境: [root@docker02 anchors]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) [root@do ...

  3. centos记录uptime,tomcat日志切割,远程拷贝日志脚本

    1.uptime日志脚本(每天记录) #!/bin/sh dir=/tmp/uptime_log process=`ps -ef|grep $|grep -v "grep" |gr ...

  4. jQuery ajax的前台代码编写

    jQuery ajax的前台代码: <script type="text/javascript" src="/include/jquery/jquery-1.1.3 ...

  5. PAT天梯赛L2-003 月饼【贪心】

    L2-003. 月饼 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不 ...

  6. TOP100summit 2017:小米唐沐等大咖精心挑选的100个年度研发案例实践

    2017年,机器学习.大数据.人工智能等词汇成为软件研发行业的主流,大前端.DevOps.区块链等技术方式成为热点方向:2017年,智能硬件开始成为新的焦点,这一年更被称为智能音箱井喷的一年:2017 ...

  7. 2018/03/18 每日一个Linux命令 之 split

    spilt 命令用于将一个文件分割成数个 默认情况下 按照每1000 切割成一个小文件 split [-参数] [要切割的文件] [输出文件名] 参数 -[行数] 指定每多少行切成一个小文件 -b 字 ...

  8. bin/hdfs namenode -format 格式化失败

    确认配置正确前提下,将name目录删除重建,再格式化: hadoop防止将已经存在的集群格式化

  9. mongodb基础语法

    Mongodb与关系型数据库最大的区别就是无约束, 既无字段(外键等)约束, 也没有数据类型约束, 以json存储 安装 启动Mongodb(默认在c盘找 data/db/文件夹) 服务端: mong ...

  10. 冒泡排序快速版(C)

    冒泡排序C语言版:在每轮排序中检查时候有元素位置交换,如果无交换,说明数组元素已经有序,无需继续排序 #include <stdio.h> #include <stdlib.h> ...