适配器模式(Adapter)

考虑一个记录日志的应用,由于用户对日志记录的要求很高,使得开发人员不能简单地采用一些已有的日志工具或日志框架来满足用户的要求,而需要按照用户的要求重新开发新的日志管理系统,如需要用文件和数据库形式分别保存日志数据。

适配器模式的定义是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

public classLogModel {

privateString logId;

privateString operateUser;

privateString operateTime;

privateString logContent;

publicString getLogId(){

return logId;

}

publicvoidsetLogId(String logId){

this.logId= logId;

}

publicString getOperateUser(){

return operateUser;

}

publicvoidsetOperateUser(String operateUser){

this.operateUser=operateUser;

}

publicString getOperateTime(){

return operateTime;

}

publicvoidsetOperateTime(String operateTime){

this.operateTime=operateTime;

}

publicString getLogContent(){

return logContent;

}

publicvoidsetLogContent(String logContent){

this.logContent=logContent;

}

}

import java.util.List;

public interfaceLogFileOperateApi {

publicList<LogModel> readLogFile();

publicvoidwriteLogFile(List<LogModel> list);

}

import java.util.List;

public interfaceLogDbOperateApi {

publicvoidcreateLog(LogModel lm);

publicvoidupdateLog(LogModel lm);

publicvoidremoveLog(LogModel lm);

publicList<LogModel>getAllLog();

}

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.List;

public classLogFileOperate implements LogFileOperateApi{

private String logFilePathName = "test.log";

public LogFileOperate(StringlogFilePathName){

if(logFilePathName!=null &&logFilePathName.trim().length()>0){

this.logFilePathName=logFilePathName;

}

}

@Override

public List<LogModel>readLogFile() {

// TODO Auto-generated method stub

List<LogModel>list = null;

ObjectInputStreamoin = null;

try{

Filef = newFile(logFilePathName);

if(f.exists()){

oin=new ObjectInputStream(new BufferedInputStream(new FileInputStream(f)));

list=(List<LogModel>)oin.readObject();

}

}catch(Exception e){

e.printStackTrace();

}finally{

try{

if(oin!=null){

oin.close();

}

}catch(IOException e){

e.printStackTrace();

}

}

return list;

}

@Override

public voidwriteLogFile(List<LogModel> list) {

// TODO Auto-generated method stub

Filef=newFile(logFilePathName);

ObjectOutputStreamoout=null;

try{

oout=new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(f)));

oout.writeObject(list);

}catch(IOException e){

e.printStackTrace();

}finally{

try{

oout.close();

}catch(IOException e){

e.printStackTrace();

}

}

}

}

import java.util.List;

public classLogDbOperate implements LogDbOperateApi{

@Override

public void createLog(LogModel lm){

// TODO Auto-generated method stub

System.out.println("now in LogDbOperate createLog,lm="+lm);

}

@Override

public void updateLog(LogModel lm){

// TODO Auto-generated method stub

System.out.println("now in LogDbOperate updateLog,lm="+lm);

}

@Override

public void removeLog(LogModel lm){

// TODO Auto-generated method stub

System.out.println("now in LogDbOperate removeLog,lm="+lm);

}

@Override

public List<LogModel>getAllLog() {

// TODO Auto-generated method stub

System.out.println("now in LogDbOperate getAllLog");

return null;

}

}

import java.util.List;

public classTwoDirectAdapter implements LogDbOperateApi,LogFileOperateApi{

private LogFileOperateApi fileLog;

private LogDbOperateApi dbLog;

publicTwoDirectAdapter(LogFileOperateApi fileLog,LogDbOperateApi dbLog){

this.fileLog=fileLog;

this.dbLog=dbLog;

}

@Override

public List<LogModel>readLogFile() {

// TODO Auto-generated method stub

return null;

}

@Override

public voidwriteLogFile(List<LogModel> list) {

// TODO Auto-generated method stub

}

@Override

public void createLog(LogModel lm){

// TODO Auto-generated method stub

List<LogModel>list=fileLog.readLogFile();

list.add(lm);

fileLog.writeLogFile(list);

}

@Override

public void updateLog(LogModel lm){

// TODO Auto-generated method stub

}

@Override

public void removeLog(LogModel lm){

// TODO Auto-generated method stub

List<LogModel>list=fileLog.readLogFile();

list.remove(lm);

fileLog.writeLogFile(list);

}

@Override

public List<LogModel>getAllLog() {

// TODO Auto-generated method stub

return fileLog.readLogFile();

}

}

import java.util.ArrayList;

import java.util.List;

public classClient {

publicstaticvoidmain(String[] args){

LogModel lm = new LogModel();

lm.setLogId("001");

lm.setOperateUser("admin");

lm.setOperateTime("2010-03-22");

lm.setLogContent("this is just for testing on purpose");

List<LogModel> list=newArrayList<LogModel>();

list.add(lm);

LogFileOperateApi fileLogApi=new LogFileOperate("");

LogDbOperateApi dbLogApi=new LogDbOperate();

LogFileOperateApi fileLogApi2=newTwoDirectAdapter(fileLogApi,dbLogApi);

LogDbOperateApi dbLogApi2=newTwoDirectAdapter(fileLogApi,dbLogApi);

dbLogApi2.createLog(lm);

List<LogModel>allLog=dbLogApi2.getAllLog();

System.out.println(allLog);

fileLogApi2.writeLogFile(list);

fileLogApi2.readLogFile();

}

}

设计模式(三)-- 适配器模式(Adapter)的更多相关文章

  1. 8.3 GOF设计模式二: 适配器模式 Adapter

    GOF设计模式二: 适配器模式 Adapter  为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式  SingleTon的三个关键点  ...

  2. 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

    怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...

  3. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...

  4. 【设计模式】适配器模式 Adapter Pattern

    适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...

  5. 二十四种设计模式:适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.示例有一个Message实体类 ...

  6. 研磨设计模式解析及python代码实现——(三)适配器模式(Adapter)

    一.适配器模式定义 将一个类的接口转换成另外一个接口,适配器模式使得原本由于接口不兼容,而不能在一起工作的哪些类能够在一起工作. 二.python 实现 import string import cP ...

  7. JavaScript设计模式 Item9 --适配器模式Adapter

    适配器模式(转换器面模式),通常是为要使用的接口,不符本应用或本系统使用,而需引入的中间适配层类或对象的情况. 适配器模式的作用是解决两个软件实体间的接口不兼容的问题. 一.定义 适配器模式(Adap ...

  8. python 设计模式之适配器模式 Adapter Class/Object Pattern

    #写在前面 看完了<妙味>和<华医>,又情不自禁的找小说看,点开了推荐里面随机弹出的<暗恋.橘生淮南>,翻了下里面的评论,有个读者从里面摘了一段自己很喜欢的话出来, ...

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

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

  10. 设计模式之适配器模式(Adapter)(6)

    简介 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用呢? ...

随机推荐

  1. ELK 之一:ElasticSearch 基础和集群搭建

    一:需求及基础: 场景: 1.开发人员不能登录线上服务器查看详细日志 2.各个系统都有日志,日志数据分散难以查找 3.日志数据量大,查询速度慢,或者数据不够实时 4.一个调用会涉及到多个系统,难以在这 ...

  2. 高级UIKit-03(NSFileManager、NSFileHandle)

    fileManager文件管理器 [day04_1_FileManager_Search] :查找文件 fileManager有一个方法可以判断文件是否是文件夹, fileExistsAtPath:i ...

  3. Agg vs. Cairo 二维绘图引擎之比较和选择 .

    Agg vs. Cairo 二维绘图引擎之比较和选择 cheungmine 当今时代对于作为二维图形软件开发者, 是幸运的.因为除了Windows GDI/GDI+之外,我们还有很多其他的选择.而且这 ...

  4. 京东金融集团BD部门招聘 BD经理

    新标签页http://74.55.154.136/ 互联网招聘_cnBeta.COM 北京 / 全职 / 20k-30k / 经验3-5年 / 本科及以上 / 1天前发布 职位诱惑 : 五险一金 职位 ...

  5. 【PAT】1041. Be Unique (20)

    题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1041 题目描述: Being unique is so important to people ...

  6. Linux - 输入输出流程序 代码(C)

    输入输出流程序 代码(C) 本文地址:http://blog.csdn.net/caroline_wendy 使用输入输出流,控制文件流. STDIN_FILENO,STDOUT_FILENO代表标准 ...

  7. CentOS桌面环境如何打开终端以及如何将终端加入右键

    安装完CentOS的桌面环境后,默认在桌面以及右键是没有打开终端选项的,要想打开终端,可以由以下步骤: 在左上角菜单[Applications]--->[System Tools]---> ...

  8. 安装windows7导致Ubuntu启动项消失的问题的解决

    系统原来是Ubuntu14,前两天安装win7后,启动直接是win7.也就是Ubuntu的启动项消失了. 在windows下尝试非常多方法,都以失败告终,最后选择Ubuntu下boot-repair软 ...

  9. 我的Android开发相关文�

    Pro Android学习笔记: Pro Android学习笔记(一一七):Location(3):获取位置更新 2014.8.25 Pro Android学习笔记(一一六):Location(2): ...

  10. Eclipse用法和技巧十五:自动添加未实现方法1

    java代码中经常要实现一些接口,这个也是java代码独有的地方.实现接口,就意味着要实现这个接口中定义的方法,如果一个个去码出方法就需要记得方法名称等等,就算有内容辅助快捷键帮助,也是很麻烦的.这里 ...