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

由于告警开发进度较快,已经实现了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. Spring Cloud Eureka 服务治理机制

     服务提供者         服务提供者在启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息.Eureka Server 接收到这个RE ...

  2. split陷阱

    如果split最后一个为空,则要这么写 String[] lines=line.split(",",-1);

  3. ZOJ 3985 - String of CCPC - [字符串处理]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3985 题意: 给出一个长度为n的字符串,全部由'C'和'P'组成 ...

  4. Kettle 4.2源码分析第三讲--Kettle 转换机制transformation介绍

    转换机制 每个转换步骤都是ETL数据流里面的一个任务.转换步骤包括输入.处理和输出.输入步骤从外部数据源获取数据,例如文件或者数据库:处理步骤处理数据流,字段计算,流处理等,例如整合或者过滤.输出步骤 ...

  5. 加入到java后台开发

    下载java环境安装包 http://www.oracle.com/technetwork/java/javase/overview/index.html 下载eclipse j2ee版本 http: ...

  6. 判断tableViewCell是否在可视区

    1.- (NSArray *)visibleCells; UITableview 的方法,这个最直接,返回一个UITableviewcell的数组. 对于自定义的cell,之后的处理可能会稍微复杂. ...

  7. php 中date显示时间不对与Linux文件乱码问题

    php 中date显示时间不对解决办法如下1.修改/etc/php.ini文件 在里头中找到data.timezone =去掉它前面的分号';' 然后设置data.timezone = “Asia/S ...

  8. MySQL字符集的一个坑

    MySQL字符集的一个坑 http://imysql.com/2013/10/29/misunderstand-about-charset-handshake.shtml MySQL字符集的一个坑 1 ...

  9. 007-spring cloud gateway-GatewayAutoConfiguration核心配置-RouteDefinition初始化加载

    一.RouteDefinitionLocator 在Spring-Cloud-Gateway的GatewayAutoConfiguration初始化加载中会加载RouteDefinitionLocat ...

  10. Spark On Yarn Cluster生产环境下JVM的OOM和Stack Overflow问题

    1.Spark on Yarn下JVM的OOM问题及解决方式 2.Spark中Driver的Stack Overflow的问题及解决方式 Spark on Yarn cluster mode: 此时有 ...