设计模式(三)-- 适配器模式(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)
简介 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用呢? ...
随机推荐
- 2^x mod n = 1 【杭电-HDOJ-1395】 附题
/* 2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- MongoDB 操作手冊CRUD查询指针
枚举遍历指针 概述 前面已经讲过,db.collection.find()假设没有指定给一个var声明的变量.将自己主动枚举前20条记录. 手动枚举指针 在mongo控制台中.将查询赋给一个var声明 ...
- AES SHA-1 SM3 MD5
AES是美国国家标准技术研究所NIST旨在代替DES的21世纪的加密标准. 输入:128bit 的消息分组 输出:128bit 的密文分组 密钥长度及圈数 128 10 192 12 256 14 消 ...
- Lucene核心--构建Lucene搜索(上篇,理论篇)
2.1构建Lucene搜索 2.1.1 Lucene内容模型 一个文档(document)就是Lucene建立索引和搜索的原子单元,它由一个或者多个字段(field)组成,字段才是Lucene的真实内 ...
- 关于怎么C#控制台窗口中怎么创建连接查询数据库操作
首先需要新建一张表,为了测试随建了一张学生表 新建号一张表之后就可以对数据库进行操作了 列举了常用的增删改查 操作 static void Main(string[] args) { s ...
- Docker学习笔记(4) — 开启Docker远程访问
默认情况下,Docker守护进程会生成一个socket(/var/run/docker.sock)文件来进程本地进程通信,而不会监听任何端口,因此只能在本地使用docker客户端或者使用Docker ...
- 清华集训2014 day1 task2 主旋律
题目 这可算是一道非常好的关于容斥原理的题了. 算法 好吧,这题我毫无思路,直接给正解. 首先,问题的正面不容易求,那么就求反面吧: 有多少种添加边的方案,使得这个图是DAG图(这里及以下所说的DAG ...
- 关于SSH框架设计的一些理解
近期在学习企业开发领域非常流行的SSH框架(Struts.Hibernate.Spring).因为之前有做过原生的Servlet+JSP的项目,所以在学习过程中我会跟原生开发模式进行对照,在这里我把自 ...
- Android屏幕大小适配问题解决
转载: 一.一些基本概念 1.长度(真实长度):英寸.inch 2.分辨率:density 每英寸像素数 dpi(密度) 3.像素:px 4.dip的公式:px /dip=dpi/160 所以 d ...
- 互联网组织的未来:剖析GitHub员工的任性之源(转)
如果有这么家任性的公司,没有所谓“经理人”这一层,人都在做自己喜欢的事情,并且创造价值,而其他的事情,就顺其自然让他发生.这里能节省多少官僚主义带来的浪费?这样的公司得跑得有多快?得有多少无谓的冲突消 ...