适配器模式(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. linux signal 处理

    v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} w/:* {behavior:url(#default#VM ...

  2. Menu的自己定义实现-------保卫萝卜造塔升级塔菜单实现

    cocos2dx原生的menu排版函数实现的非常无完整,像最主要的Item的排序要想做得略微美丽一些就须要我们自己实现. 对于Menu我们能够用两种方法来实现: 1.大神级别. 继承自Control, ...

  3. Python笔记之基本的语法

    1 变量和赋值 Python是动态类型语言,不须要预先声明变量的类型.变量的类型在赋值的那一刻被初始化. Python变量名是大写和小写敏感的,即"cAsE"与"CaSe ...

  4. Android模拟器的文件目录介绍

    文件存放在 .avd文件夹下 .ini为对应的配置文件     打开.avd文件夹 *.lock文件夹保存的是模拟器的一下数据,当模拟器正常关闭时这些文件夹都会被自动删除. 当模拟器无法开启的时候可以 ...

  5. WinForm - 格式化DataGridView单元格数据

    效果: 代码: /// <summary> /// 格式化数据 /// </summary> private void dataGridView1_CellFormatting ...

  6. SSH框架总结(框架分析+环境搭建+实例源码下载)(转)

    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...

  7. 设计模式(三)建造者模式Builder(创建型)

    1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...

  8. C语言的system函数

     这个是与操作系统有关的函数,在linux/unix下system可以运行所有的shell命令windows下system可运行所有的windows执行文件,除DOS命令外,也可运行windwos ...

  9. boost:库program_options--第一篇

    程式執行參數處理函式庫:Boost Program Options(1/N) 一般程式寫得大一點.或是需要比較有彈性,通常都需要在程式執行的時候,從外部讀取一些參數,來做為內部的設定值.一般來說,比較 ...

  10. Java中StringBuilder的清空方法比較

    StringBuilder 没有提供clear或empty方法. 清空有3种方法: 1)新生成一个,旧的由系统自己主动回收 2)使用delete 3)使用setLength 将三种方法循环1000万次 ...