适配器模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器模式相关的知识,希望对你有一定的参考价值。
转载请注明原文链接,http://www.cnblogs.com/flyingcloude/p/6992360.html
模式的功能:
适配器模式的主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新的接口,也就是说,客户端需要的功能应该是已经实现好了的,不需要适配器模式来实现,适配器模式主要负责把不兼容的接口转换成客户端期望的样子就可以了。
但这并不是说,在适配器里面就不能实现功能,适配器里面可以实现功能,称这种适配器为智能适配器。
- package adapter_2;
- import java.io.Serializable;
- /*
- ** @author: flyingcloude
- ** @version 2012-1-30 下午2:25:10
- **
- */
- public class LogModel implements Serializable
- {
- private static final long serialVersionUID = 1L;
- /*日志编号*/
- private String logId;
- /*操作人员*/
- private String operateUser;
- /*操作时间,以yyyy-mm-dd hh:mm:ss的格式记录*/
- private String operateTime;
- /*日志内容*/
- private String logContent;
- public String getLogId()
- {
- return logId;
- }
- public void setLogId(String logId)
- {
- this.logId = logId;
- }
- public String getOperateUser()
- {
- return operateUser;
- }
- public void setOperateUser(String operateUser)
- {
- this.operateUser = operateUser;
- }
- public String getOperateTime()
- {
- return operateTime;
- }
- public void setOperateTime(String operateTime)
- {
- this.operateTime = operateTime;
- }
- public String getLogContent()
- {
- return logContent;
- }
- public void setLogContent(String logContent)
- {
- this.logContent = logContent;
- }
- public String toString()
- {
- return "logId=" + logId + ",operateUser= " + operateUser
- +",operateTime=" + operateTime+",logContent=" + logContent;
- }
- }
- package adapter_2;
- import java.util.List;
- /*
- ** @author: flyingcloude
- ** @version 2012-1-30 下午2:51:32
- **
- */
- public interface LogFileOperateApi
- {
- /*
- *读取日志文件,从文件里面获取存储的日志列表对象
- *@return 存储的日志列表对象
- */
- public List<LogModel> readLogFile();
- /*
- *写日志文件,把日志列表写出到日志文件中去
- *@param list要写到日志文件的日志列表
- */
- public void writeLogFile(List<LogModel> list);
- }
- package adapter_2;
- 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;
- /*
- ** @author: flyingcloude
- ** @version 2012-1-30 下午2:56:45
- **
- */
- public class LogFileOperate implements LogFileOperateApi{
- /*
- * 日志文件的路径和文件名称,默认是当前项目根下的AdapterLog.log
- */
- public String logFilePathName = "AdapterLog.log";
- /*
- *构造方法,传人文件的路径和名称
- *@param logFilePathName文件的路径和名称
- */
- public LogFileOperate(String logFilePathName)
- {
- //先判断是否传人了文件的路径和名称,如果是
- //就重新设置操作的日志文件的路径和名称
- if(logFilePathName != null && logFilePathName.trim().length() > 0)
- {
- this.logFilePathName = logFilePathName;
- }
- }
- public List<LogModel> readLogFile() {
- List<LogModel> list = null;
- ObjectInputStream oin = null;
- try{
- File f = new File(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;
- }
- public void writeLogFile(List<LogModel> list) {
- File f = new File(logFilePathName);
- ObjectOutputStream oout = 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();
- }
- }
- }
- }
- package adapter_2;
- import java.util.List;
- /*
- ** @author: flyingcloude
- ** @version 2012-1-31 上午8:58:56
- **
- */
- public interface LogDbOperateApi
- {
- /*
- * 新增日志
- * @param lm 需要新增的日志对象
- */
- public void createLog(LogModel lm);
- /*
- * 修改日志
- * @param lm 需要修改的日志对象
- */
- public void updateLog(LogModel lm);
- /*
- * 删除日志
- * @param lm 需要删除的日志对象
- */
- public void removeLog(LogModel lm);
- /*
- * 获取所有的日志
- * @return 所有的日志对象
- */
- public List<LogModel> getAllLog();
- }
- package adapter_2;
- import java.util.List;
- /*
- ** @author: flyingcloude
- ** @version 2012-1-31 上午9:10:44
- **
- */
- public class Adapter implements LogDbOperateApi
- {
- /*
- * 持有需要被适配的接口对象
- */
- private LogFileOperateApi adaptee;
- /*
- * 构造方法,传人需要被适配的对象
- * @param adaptee 需要被适配的对象
- */
- public Adapter(LogFileOperateApi adaptee)
- {
- this.adaptee = adaptee;
- }
- public void createLog(LogModel lm) {
- //先读取文件的内容
- List<LogModel> list = adaptee.readLogFile();
- //加入新的日志对象
- list.add(lm);
- //重新写入文件
- adaptee.writeLogFile(list);
- }
- public void updateLog(LogModel lm) {
- //先读取文件的内容
- List<LogModel> list = adaptee.readLogFile();
- //修改相应的日志对象
- for(int i = 0; i < list.size(); i++)
- {
- if(list.get(i).getLogId().equals(lm.getLogId()))
- {
- list.set(i, lm);
- break;
- }
- }
- //重新写入文件
- adaptee.writeLogFile(list);
- }
- public void removeLog(LogModel lm) {
- //先读取文件的内容
- List<LogModel> list = adaptee.readLogFile();
- //删除相应的日志对象
- list.remove(lm);
- //重新写入文件
- adaptee.writeLogFile(list);
- }
- public List<LogModel> getAllLog() {
- return adaptee.readLogFile();
- }
- }
- package adapter_2;
- import java.util.ArrayList;
- import java.util.List;
- /*
- ** @author: flyingcloude
- ** @version 2012-1-30 下午4:19:01
- **
- */
- public class Client{
- /**
- * @param args
- */
- public static void main(String[] args) {
- //准备日志内容,也就是测试的数据
- LogModel lml = new LogModel();
- lml.setLogId("001");
- lml.setOperateUser("admin");
- lml.setOperateTime("2010-03-02 10:08:18");
- lml.setLogContent("这是一个测试");
- List<LogModel> list = new ArrayList<LogModel>();
- list.add(lml);
- //创建操作日志文件的对象
- LogFileOperateApi logFileApi = new LogFileOperate("log");
- //创建新版操作日志的接口对象
- LogDbOperateApi api = new Adapter(logFileApi);
- //保存日志文件
- api.createLog(lml);
- //读取日志文件的内容
- List<LogModel> allLog = api.getAllLog();
- System.out.println("allLog=" + allLog);
- }
- }
上述代码中,LogModel.Java,LogFileOperateApi.java,LogFileOperate.java是在日志管理软件中就实现了的,但是随着应用的深入,需要增加日志新增、日志修改、日志删除、读取所有日志的功能,可是又不想抛弃LogFileOperateApi.java、LogFileOperate.java的实现,故采用了适配器模式,将LogFileOperateApi.java、LogFileOperate.java中进行转换。
转载请注明原文链接,http://www.cnblogs.com/flyingcloude/p/6992360.html
以上是关于适配器模式的主要内容,如果未能解决你的问题,请参考以下文章
尚硅谷设计模式学习 --- [类适配器模式对象适配器模式接口适配器模式]
设计模式 结构型模式 -- 适配器模式(概述类适配器模式对象适配器模式适配器模式适用场景JDK源码解析(I / O流))