设计模式--适配器模式

来源:互联网 发布:创建mysql数据库表 编辑:程序博客网 时间:2024/06/06 18:07

1.定义:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

2.简单代码:

public interface Target {public void doSomething();}public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void doSomething() {adaptee.doSomething();}}public class Adaptee implements Target {@Overridepublic void doSomething() {System.out.println("dodododo some thing");}}public class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();// 被适配者Adapter adapter = new Adapter(adaptee);// 适配器adapter.doSomething();}}

3.项目中应该怎么应用呢,举个例子

//日志数据对象public class LogModel implements Serializable {private static final long serialVersionUID = -295263677710284492L;// 日志编号private String logId;// 操作人员private String operateUser;// 操作时间,格式 yyyy-MM-dd HH:mm:ssprivate 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;}@Overridepublic String toString() {return "LogModel [logId=" + logId + ", operateUser=" + operateUser+ ", operateTime=" + operateTime + ", logContent=" + logContent+ "]";}}//日志文件操作接口public interface LogFileOperateApi {// 读取日志文件,从文件里面获取存储的日志列表对象public List<LogModel> readLogFile();// 写日志文件,把日志列表写出到日志文件中去public void writeLogFile(List<LogModel> list);}//实现对日志文件的操作public class LogFileOperate implements LogFileOperateApi {// 日志文件的路径和文件名称,默认是当前项目根下的ApapterLog.logprivate String logFilePathName = "AdapterLog.log";public LogFileOperate(String logFilePathName) {// 先判断是否传入了文件的路径和名称,如果是,// 就重新设置操作的日志文件的路径和名称if (logFilePathName != null && logFilePathName.trim().length() > 0) {this.logFilePathName = logFilePathName;}}@SuppressWarnings("unchecked")@Overridepublic 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;}@Overridepublic 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();}}}}//定义操作日子还的应用接口,为了实例的简单,只是简单地定义了增删改查的方法public interface LogDbOperateApi {// 新增日志public void createLog(LogModel lm);// 修改日志public void updateLog(LogModel lm);// 删除日志public void deleteLog(LogModel lm);// 获取日志public List<LogModel> getAllLog();}public class Adapter implements LogDbOperateApi {private LogFileOperateApi adaptee;public Adapter(LogFileOperateApi adaptee) {this.adaptee = adaptee;}@Overridepublic void createLog(LogModel lm) {// 1.先读取文件的内容List<LogModel> list = adaptee.readLogFile();// 2.加入新的日志对象list.add(lm);// 3.重新写入文件adaptee.writeLogFile(list);}@Overridepublic void updateLog(LogModel lm) {// 1.先读取文件的内容List<LogModel> list = adaptee.readLogFile();// 2.修改相应的日志对象for (int i = 0; i < list.size(); i++) {if (list.get(i).getLogId().equals(lm.getLogId())) {list.set(i, lm);break;}}// 3.重新写人文件adaptee.writeLogFile(list);}@Overridepublic void deleteLog(LogModel lm) {// 1.先读取文件的内容List<LogModel> list = adaptee.readLogFile();// 2.删除相应的日志对象list.remove(lm);// 3.重新写入文件adaptee.writeLogFile(list);}@Overridepublic List<LogModel> getAllLog() {return adaptee.readLogFile();}}public class Client {public static void main(String[] args) {// 准备日志内容,也就是测试数据LogModel lml = new LogModel();lml.setLogId("001");lml.setOperateUser("admin");lml.setOperateTime("2014-10-31 10:18:14");lml.setLogContent("这是一个测试数据");LogModel lm2 = new LogModel();lm2.setLogId("002");lm2.setOperateUser("root");lm2.setOperateTime("2014-11-30 09:11:57");lm2.setLogContent("这是第二条测试数据");List<LogModel> list = new ArrayList<LogModel>();list.add(lml);list.add(lm2);// 创建操作日志文件的对象LogFileOperateApi logFileApi = new LogFileOperate("");// 创建新版操作日志的接口对象LogDbOperateApi api = new Adapter(logFileApi);// 保存日志文件// logFileApi.writeLogFile(list);api.createLog(lml);// 读取日志文件的内容// List<LogModel> readLog = logFileApi.readLogFile();// System.out.println("readLog=" + readLog);List<LogModel> allLog = api.getAllLog();System.out.println("allLog=" + allLog);}}


4.适配器模式的本质---转换匹配,复用功能。

5.优点: 更好的复用 如果功能是已经有了的,只是接口不兼容,那么通过适配器模式就可以让这些功能得到更好的复用。

                 更好的可扩展--在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。

6.缺点:过多的适配,会让系统非常的凌乱,不容易整理进行把握。因此如果不是很有必要,可以不使用适配器,而似乎直接对系统进行重构。

0 0
原创粉丝点击