适配器模式(二)-----简单的实现一个适配器模式

来源:互联网 发布:淘宝开店教程全集下载 编辑:程序博客网 时间:2024/05/21 08:44
利用适配器模式的解决问题
    案例:
    我们先来看这样的一个需求,客户需要我们实现一个文件的日志管理,客户要求日志以文件的形式记录(第一版)。软件完成交给客户,当客户使用了一段时间后,考虑升级系统,决定要采用数据库来管理日志(第二版)。很快,按照数据库的日志管理也实现出来了,并定义了日志管理的操作接口,主要针对日志的增删查改方法。这时客户又提出了新的要求,能不能让日志管理第二版实现同时支持数据库存储和文件存储两种方式。

    分析:

解决办法:利用对象组合的方式使用适配器模式


代码如下:

(1)日志对象
  <pre name="code" class="java">  package adapter1;/** * 日志数据对象 * @author Administrator * */public class LogModel {    //日志编号    private String logid;    //操作人员    private String operateUser;    //操作时间    private String operateTime;    //日志内容    private String logContent;    public LogModel(String logid, String operateUser, String operateTime,            String logContent) {        super();        this.logid = logid;        this.operateUser = operateUser;        this.operateTime = operateTime;        this.logContent = 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;    }    @Override    public String toString() {        return "LogModel [logid=" + logid + ", operateUser=" + operateUser                + ", operateTime=" + operateTime + ", logContent=" + logContent                + "]";    }}

(2)操作日志的接口

  package adapter1;import java.util.List;/** * 日志文件操作接口 * @author Administrator * */public interface LogFileOperateApi {    /**     * 读取日志文件,从文件里面获取存储的日志列表对象     * @return  日志列表对象     */    public List<LogModel> readLogFile();    /**     * 写日志文件,把日志列表写出到日志文件中去     * @param list     */    public void writeLogFile(List<LogModel> list);}
(3)实现日志文件的存取

  package adapter1;import java.util.List;/** * 实现对日志文件的操作 * @author Administrator * */public class LogFileOperate implements LogFileOperateApi {    /**     * 简单的写了个方法的实现     */    @Override    public List<LogModel> readLogFile() {        // TODO Auto-generated method stub        System.out.println("正在读日志文件。。。。。");        return null; //本应该返回读取的日志  此时当做null处理    }    @Override    public void writeLogFile(List<LogModel> list) {        // TODO Auto-generated method stub        System.out.println("正在写日志文件。。。。。");    }}
(4)定义操作日志的应用接口,为了实例的简单,只是简单的定义了增删查改方法

package adapter1;import java.util.List;/** * 定义操作日志的应用接口,为了实例的简单,只是简单的定义了增删查改方法 * @author Administrator * */public interface LogDbOperateApi {    //增    void createLog(LogModel lm);    //删    void removeLog(LogModel lm);    //查    List<LogModel> getAll();    //改    void updateLog(LogModel lm);}

(5)适配器对象,将记录日志到文件的功能适配成第二版需要的增删查改功能

package adapter1;import java.util.List;/** * 适配器对象,将记录日志到文件的功能适配成第二版需要的增删查改功能 * @author Administrator * */public class Adapter implements LogDbOperateApi{    //持有需要被适配的接口对象    private LogFileOperateApi adaptee;    //构造方法,传入需要被适配的对象    public Adapter(LogFileOperateApi adaptee) {        super();        this.adaptee = adaptee;    }    @Override    public void createLog(LogModel lm) {        // TODO Auto-generated method stub        System.out.println("通过被适配的接口对象增加日志文件---"+                "adaptee.readLogFile();adaptee.writeLogFile(list);");    }    @Override    public void removeLog(LogModel lm) {        // TODO Auto-generated method stub        System.out.println("通过被适配的接口对象删除日志文件---"+                    "adaptee.readLogFile();adaptee.writeLogFile(list);");    }    @Override    public List<LogModel> getAll() {        // TODO Auto-generated method stub        System.out.println("通过被适配的接口对象查找日志文件---"+                        "adaptee.readLogFile()");        return null;    }    @Override    public void updateLog(LogModel lm) {        // TODO Auto-generated method stub        System.out.println("通过被适配的接口对象修改文件---"+                "adaptee.readLogFile();adaptee.writeLogFile(list);");    }}
(6)客户端代码

package adapter1;import java.util.ArrayList;import java.util.List;public class Client {    public static void main(String[] args) {        LogModel lm = new LogModel("01", "admin", "2016-3-4 23:47", "测试适配器模式");        List<LogModel> list = new ArrayList<LogModel>();        list.add(lm);        //创建日志文件对象        LogFileOperateApi logFileApi = new LogFileOperate();        //创建新版本日志接口对象        LogDbOperateApi api = new Adapter(logFileApi);        //保存日志文件        api.createLog(lm);        //读取日志文件的内容        api.getAll();    }}

从头认识适配器模式:
        适配器的实现方式是依靠对象组合的方式。通过给适配器对象组合被适配的对象,然后客户端调用Target的时候,适配器会把相应的功能委托给被适配的对象去完成。适配器的主要功能就是进行转换,目的是服用已有的功能,而不是来实现新的接口。也就是说,客户端需要的功能应该是已经实现好的,不需要适配器模式来实现,适配器模式主要负责把不兼容的接口转换成客户端期望的样子就可以了。但是过多的使用适配器,会让系统非常零乱,不容易整体把握。因此如果不是很有必要,可以不使用适配器,而是 直接对系统重构。




0 0
原创粉丝点击