设计模式(三)-- 适配器模式(Adapter)
适配器模式(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)的更多相关文章
- 8.3 GOF设计模式二: 适配器模式 Adapter
GOF设计模式二: 适配器模式 Adapter 为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式 SingleTon的三个关键点 ...
- 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)
怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...
- 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)
原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...
- 【设计模式】适配器模式 Adapter Pattern
适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...
- 二十四种设计模式:适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.示例有一个Message实体类 ...
- 研磨设计模式解析及python代码实现——(三)适配器模式(Adapter)
一.适配器模式定义 将一个类的接口转换成另外一个接口,适配器模式使得原本由于接口不兼容,而不能在一起工作的哪些类能够在一起工作. 二.python 实现 import string import cP ...
- JavaScript设计模式 Item9 --适配器模式Adapter
适配器模式(转换器面模式),通常是为要使用的接口,不符本应用或本系统使用,而需引入的中间适配层类或对象的情况. 适配器模式的作用是解决两个软件实体间的接口不兼容的问题. 一.定义 适配器模式(Adap ...
- python 设计模式之适配器模式 Adapter Class/Object Pattern
#写在前面 看完了<妙味>和<华医>,又情不自禁的找小说看,点开了推荐里面随机弹出的<暗恋.橘生淮南>,翻了下里面的评论,有个读者从里面摘了一段自己很喜欢的话出来, ...
- java设计模式之六适配器模式(Adapter)
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...
- 设计模式之适配器模式(Adapter)(6)
简介 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用呢? ...
随机推荐
- Android内存泄漏简介
前言 不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露. 其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用, ...
- Excel自己定义纸张打印设置碰到无法对上尺寸的问题
作者:iamlaosong 据操作人员反映.自己定义纸张设置无论用,打印时每页表头都会下移,非常快就跑偏到下涨纸了. 打印机是针打,齿轮进纸.应该非常精确的.初步怀疑纸张尺寸量的有问题,建议其多量几页 ...
- android软键盘弹出隐藏的监听
通过网上搜索关于软键盘的隐藏弹出的监听,有几种方式,其中最有效的方式是在View的Onlayout()里面做文章 具体代码: 将布局视图自定义,重写onlayout()方法,然后在主Activity里 ...
- 在 Windows Azure 网站上使用 Django、Python 和 MySQL:创建博客应用程序
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 撰写. 根据您编写的应用程序,Windows Azure 网站上的基本Python 堆 ...
- 基于visual Studio2013解决C语言竞赛题之0808打印链表
题目
- Deamon Thread 讲解
The daemon thread's life cycle is same with the life cycle of the application which starts this daem ...
- SVN库迁移
最后库迁移.机会主义的,在源库资源,然后上传到目标库,最后client更新url地址.的库被组长一眼识破,由于新库中没有大家的操作日志. 这次吸取上次的教训,用dump和load完毕SVN库迁移. 整 ...
- ClassLoader载入指定的类需注意六个细节或报ClassNotFundEception异常总结
项目中,载入指定的类反射调用方法一直报类找不到,经过数百次的測试.对这样的问题有了一个又一次的认识,特总结.记录.分享例如以下: 1.路径中尽可能用"/"或者File.separa ...
- Android智能手机屏蔽电话与屏蔽安装软件功能
近期做一些项目.须要对手机进行屏蔽自己的固有的功能.在此记录. Android屏蔽电话功能主要是卸载掉Phone.apk. 屏蔽安装软件功能主要是卸载掉PackageInstall.apk 以下以三星 ...
- 私有析构函数 Android 代码分析
有人说声明 Private Destructor, 这对象只能在 stack 上创建,不能在Heap上创建, 其实错了, 这样的程序编译都过不了. 那为何会有 Private Destructor, ...