java设计模式学习笔记---适配器

应用场景

大家可能用过耳机转换接口,他就相当于一个适配器。为了让不搭配的耳机可以使用,可以使用耳机插头转换器。

代码实例

下面这个例子演示了如何通过文件管理日志

//定义日志模型类,为了能存储日志对象,所以对象需要序列化
public class LogModel implements Serializable{
    // 日志编号
    private String logId;
    // 操作人员
    private String operatorUser;
    // 操作时间、
    private String opearateTime;
    // 日志内容
    private String logContent;

    public String getLogId() {
        return logId;
    }

    public void setLogId(String logId) {
        this.logId = logId;
    }

    public String getOperatorUser() {
        return operatorUser;
    }

    public void setOperatorUser(String operatorUser) {
        this.operatorUser = operatorUser;
    }

    public String getOpearateTime() {
        return opearateTime;
    }

    public void setOpearateTime(String opearateTime) {
        this.opearateTime = opearateTime;
    }

    public String getLogContent() {
        return logContent;
    }

    public void setLogContent(String logContent) {
        this.logContent = logContent;
    }
    //重写toString()方法
    public String toString() {
        return "logId = " + logId +
                ",operateUser = " + operatorUser +
                ",operateTime = " + opearateTime +
                ",logCotent = " + logContent;
    }
}

//日志文件管理接口
public interface LogFileOperateApi {
    //从文件读取日志,返回日志对象
    public List<LogModel> readLogFile();
    //将日志对象写入日志文件
    public void writeLogFile(List<LogModel> list);
}

//日志文件操作接口实现类
public class LogFileOperate implements LogFileOperateApi{
    //日志存储路径
    private String logFilePathName = "AdapterLog.log";
    //构造函数,传入日志路径参数
    public LogFileOperate(String logFilePathName) {
        if(logFilePathName != null && logFilePathName.trim().length() > 0) {
            this.logFilePathName = logFilePathName;
        }
    }
    //读取日志
    @SuppressWarnings({ "resource", "unchecked" })
    @Override
    public List<LogModel> readLogFile() {
        List<LogModel> list = new ArrayList<LogModel>();
        ObjectInputStream oin = null;

        File file = new File(logFilePathName);
        if(file.exists()) {
            try {
                oin = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
                list = (List<LogModel>) oin.readObject();
            } catch (ClassNotFoundException | IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    oin.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return list;
    }
    //写日志
    @Override
    public void writeLogFile(List<LogModel> list) {
        File file = new File(logFilePathName);
        ObjectOutputStream oos = null;

        try {
            oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
            oos.writeObject(list);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
//客户端
public class Client {
    public static void main(String[] args) {
        String logFilePath = "AdapterLog.log";
        LogModel log = new LogModel();
        log.setLogContent("这是一个日志测试");
        log.setLogId("1");
        log.setOpearateTime("2012-02-04 10:25:15");
        log.setOperatorUser("admin");

        List<LogModel> list = new ArrayList<LogModel>();
        list.add(log);
        //调用存储接口
        LogFileOperateApi api = new LogFileOperate(logFilePath);
        api.writeLogFile(list);
        System.out.println("存储成功");
        //调用读取接口
        List<LogModel> readList = api.readLogFile();
        System.out.println("readLog = " + readList);
    }
}

但现实是残酷的,刁钻的用户是不可能轻易放开你的。有的用户可能会提出用数据库和文件两种方式存储日志信息。
这时候你可能会选择重新实现文件接口,但是最好不要重新做已经完成的功能,这样可能会导致依赖与他的应用不能够正常运行,再说可能两种代码就是两个公司实现的,不可能修改第一种,所以应该想办法复用。这是就要用到适配器了。

修改方案如下:

public interface LogDbOPerateApi {
    public void addLog(LogModel log);
    public void updateLog(LogModel log);
    public void deletelog(LogModel log);
    public List<LogModel> getLog();
}
/**
 * 此类的作用:数据库操作日志是后来加进来的功能,用适配器可以是文件接口和数据库接口兼容;
 * 部分功能涉及到数据库,就不在实现了。
 *
 */
public class Adapter implements LogDbOPerateApi{

    LogFileOperateApi fileApi = null;
    public Adapter(LogFileOperateApi fileApi) {
        this.fileApi = fileApi;
    }

    @Override
    public void addLog(LogModel log) {
        List<LogModel> list = fileApi.readLogFile();
        list.add(log);
        fileApi.writeLogFile(list);
    }

    @Override
    public void updateLog(LogModel log) {
    }

    @Override
    public void deletelog(LogModel log) {
        List<LogModel> list = fileApi.readLogFile();
        list.remove(log);
        fileApi.writeLogFile(list);
    }

    @Override
    public List<LogModel> getLog() {
        return fileApi.readLogFile();
    }
}

//客户端更改如下
public class Client {
    public static void main(String[] args) {
        String logFilePath = "AdapterLog.log";
        LogModel log = new LogModel();
        log.setLogContent("这是一个日志测试");
        log.setLogId("1");
        log.setOpearateTime("2012-02-04 10:25:15");
        log.setOperatorUser("admin");

        List<LogModel> list = new ArrayList<LogModel>();
        list.add(log);

        LogFileOperateApi fileApi = new LogFileOperate(logFilePath);
        LogDbOPerateApi api = new Adapter(fileApi);

        api.deletelog(log);
        api.addLog(log);
        System.out.println("log = " + api.getLog());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值