首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

读《研磨设计方式》-代码笔记-适配器模式-Adapter

2012-12-28 
读《研磨设计模式》-代码笔记-适配器模式-Adapter声明:本文只为方便我个人查阅和理解,详细的分析以及源代码

读《研磨设计模式》-代码笔记-适配器模式-Adapter
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/


package design.pattern;/* * 适配器模式解决的主要问题是,现有的方法接口与客户要求的方法接口不一致 * 可以这样想,我们要写这样一个类(Adapter): * 1.这个类要符合客户的要求 ---> 那显然要implements客户要求的接口 * 2.这些接口的实现是调用已有的类 ---> 有两种方法可获得已有的类的方法: * a.组合。对应“对象适配器” * b.继承。对应“类适配器” *  * 书上讲了一个新旧版日志操作的例子(旧版日志是存储在文件里,新版是存储在数据库里) * 书上说“新旧版日志共存”,但我觉得主要解决的问题不是共存(书上也不关注新版日志操作如何实现), * 而是应该强调如何“用新版日志的接口方法去调用旧版” * 书上新版日志操作的一个方法,正是调用了旧版的方法来实现,而新版的实现需自行处理,不在讨论范围内: public void updateLog(LoginModel 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); }  书上最后作了一个扩展:双向适配器,也是很有实际意义的。还是以日志操作为例,要求: 1、主要使用旧版接口,但使用旧版接口时也希望能调用新版接口 2、新版接口能兼容旧版接口——这是前面的例子 我的理解其实就是说适配器为这两个需求提供两个“视图”或者说两套接口 视图1: 1.正常使用旧接口的方法(例如这个方法叫method()) 2.调用适配器的方法,从而实现“也能调用新接口”: new Adapter().method(); 视图2: 1.正常使用新接口的方法(例如这个方法叫method2()) 2.调用适配器的方法,从而实现“也兼容旧接口”: new Adapter().method2(); 对于适配器来说,这其实有点分裂:旧版方法method()里面的实现代码其实是新版的实现代码,method2()里面的实现代码其实是旧版的实现代码*///客户要求的接口interface Target {void request();}//现有的接口或方法。与客户要求不一致。这个“不一致”可能是多样的,不局限于“方法名不一致”//这个Adaptee也可以是实现现有的某个接口class Adaptee {public void specificRequest() {System.out.println("specificRequest in adaptee.");}}//对象适配器class ObjectAdapter implements Target {//如果Adaptee是implements某个接口,那应该写成://private IAdaptee adaptee;private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}//调用旧的方法public void request() {adaptee.specificRequest();}}//类适配器class ClassAdapter extends Adaptee implements Target {public void request() {super.specificRequest();}}//扩展:双向适配器interface IOldAdaptee {public void method();}interface INewAdaptee {public void method2();}class TwoWayAdapter implements IOldAdaptee, INewAdaptee {private IOldAdaptee oldAdaptee;private INewAdaptee newAdaptee;public void method() {newAdaptee.method2();}public void method2() {oldAdaptee.method();}}class OldAdaptee implements IOldAdaptee {public void method() {}}class NewAdaptee implements INewAdaptee {public void method2() {}}class OldClient {public void test(){IOldAdaptee adaptee = new OldAdaptee();adaptee.method();//现在客户想通过旧接口调用新版的方法,那就要有一个适配器IOldAdaptee adapter = new TwoWayAdapter();//注意这里adapter在类型是IOldAdaptee,也就是提供的是旧版的”视图“adapter.method();//适配器里面调用的是新版的方法}}class NewClient {public void test(){INewAdaptee adaptee = new NewAdaptee();adaptee.method2();//现在客户想通过新接口调用旧版的方法,那就要有一个适配器//INewAdaptee adapter = new TwoWayAdapter();adaptee = new TwoWayAdapter();adaptee.method2();//适配器里面调用的是旧版的方法}}public class AdapterPattern {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target adapter = new ObjectAdapter(adaptee);adapter.request();Target adapter2 = new ClassAdapter();adapter2.request();}}

热点排行