设计模式(三)-- 适配器模式(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)
简介 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用呢? ...
随机推荐
- 将EC2里的实例导出到RAW文件并进行修改
你可能有自己的instance在amazon云环境里面,或者是你想深度修改一下marketplace里面提供的那些系统又估计运行中的instance改动不方便 亚马逊作为云计算领域的大哥大,我不得不说 ...
- activity横屏竖屏的切换
原理: 其实总结起来,我们可以得到以下的一些结论 1.当内存不足(不容易模拟).切屏时会调用onSaveInstanceState().onRestoreInstanceState()方法 对于onS ...
- GDSOI2015 task4 ACU
题目大意 只要你有耐心看完题目,你就可以得到以下模型: 给出一个有向图,有若干询问,每次询问对于某条边\((v,u)\),求删掉这条边后,\(v\)到\(u\)的最短路. 算法1 暴力出奇迹,期望得分 ...
- Machine Learning #Lab1# Linear Regression
Machine Learning Lab1 打算把Andrew Ng教授的#Machine Learning#相关的6个实验一一实现了贴出来- 预计时间长度战线会拉的比較长(毕竟JOS的7级浮屠还没搞 ...
- 利用opencv中的级联分类器进行人脸检測-opencv学习(1)
OpenCV支持的目标检測的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).注意,新版本号的C++接口除了Haar特征以外 ...
- []: secureCRT连接ubuntu问题- The remote system refused the connection
secureCRT连接ubuntu问题- The remote system refused the connection http://jxyang.iteye.com/blog/1484915 解 ...
- BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
Orz..跑得还挺快的#10 自从会树链剖分后LCA就没写过倍增了... 这道题用可持久化线段树..点x的线段树表示ROOT到x的这条路径上的权值线段树 ----------------------- ...
- opengl学习笔记(二)
这段时间终于接触到一点点shader了,应该说shader是非常有用的东西吧,它就是能够把一些固定渲染管线的东西改变了,按照自己的意愿进行渲染,这样的话图形就可以自由发挥了. 我也只是试验了一下sha ...
- Core 中文文档
ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序 原文:Your First ASP. ...
- 使用最新的log4cplus(1.1.1)隔离不同的 log 文件输出
部分参考了博客. http://www.cppblog.com/tx7do/articles/11719.html 基于脚本配置来过滤log信息 除了通过程序实现对log环境的配置之外,log4cpl ...