适配器模式
定义:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
结构和说明
Client:客户端,调用自己需要的领域接口Target
Target:定义客户端需要的跟特定领域相关的接口。
Adaptee:已经存在的接口,但与客户端要求的特定领域接口不一致,需要被适配。
Adapter:适配器,把Adaptee适配成为Client需要的Target。
//已经存在的接口,这个接口需要被适配
public class Adaptee {
//示意方法,原本已经存在,已经实现的方法
public void specificRequest() {
}
}
//定义客户端使用的接口,与特定领域相关
public interface Target {
//示意方法,客户端请求处理的方法
public void request();
}
//适配器
public class Adapter implements Target {
//持有需要被适配的接口对象
private Adaptee adaptee;
//构造方法,传入需要被适配的对象
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
//可能转调已经实现了的方法,进行适配
adaptee.specificRequest();
}
}
//客户端
public class Client {
public static void main(String[] args) {
//创建需要被适配的对象
Adaptee adaptee = new Adaptee();
//创建客户端需要调用的接口对象
Target target = new Adapter(adaptee);
//请求处理
target.request();
}
}
再举一个例子:
//以下是两个不兼容的接口
public interface ICooker {
void cook();
}
public interface ITeacher {
void teach();
}
//不兼容接口的实现类
public class OneCooker implements ICooker {
@Override
public void cook() {
System.out.println("厨师正在做烤鸭");
}
}
public class OneTacher implements ITeacher {
@Override
public void teach() {
System.out.println("老师正在教课");
}
}
//定义客户端使用的接口,与特定领域相关
public interface IWorkerAdapter {
void work(Object obj);
}
//适配器
public class WorkerAdapterImpl implements IWorkerAdapter {
@Override
public void work(Object obj) {
if (obj instanceof ICooker) {
((ICooker)obj).cook();
}
if (obj instanceof ITeacher) {
((ITeacher)obj).teach();
}
}
}
//客户端
public class Client {
public static void main(String[] args) {
ICooker cooker = new OneCooker();
ITeacher teacher = new OneTacher();
List<Object> workers = new ArrayList<Object>();
workers.add(cooker);
workers.add(teacher);
IWorkerAdapter workerAdapter = new WorkerAdapterImpl();
这样就使得接口不兼容的对象一起工作了
for (int i=0; i<workers.size(); i++) {
workerAdapter.work(workers.get(i));
}
}
}
- 认识适配器模式
1.适配器模式的功能
适配器模式的主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。
适配器里面也可以实现功能,称这种适配器为智能适配器。
2.Adaptee和Target的关系
适配器模式中被适配的接口Adaptee和适配成为的接口Target是没有关联的
3.对象组合
适配器的实现方式其实是依靠对象组合的方式。
//适配器
public class Adapter implements Target {
//持有需要被适配的接口对象------组合的方式
private Adaptee adaptee;
...
适配器模式的实现
1.适配器的常见实现
适配器通常是一个类,一般会让适配器类去实现Target接口,然后在适配器的具体实现里面调用Adaptee。
2.智能适配器
可以在适配器的实现里面,加入新功能的实现,这种适配器被称为智能适配器。
3.适配多个Adaptee
4.适配器Adapter实现的复杂程度
适配器Adapter实现的复杂程度,取决于Target和Adaptee的相似程度。
5.缺省适配
缺省适配的意思是:为一个接口提供缺省实现。双向适配器
适配器也可以实现双向的适配,前面我们讲得都是把Adaptee适配成为Target,其实也可以把Target适配成为Adaptee,也就是说这个适配器可以同时当做Target和Adaptee来使用。对象适配器和类适配器
1.对象适配器的实现:依赖于对象组合。就如同前面的实现实例,都是采用的对象组合的方式,也就是前面讲述的都是对象适配器实现的方式。
2.类适配器的实现:采用多重继承对一个接口与另一个接口进行匹配。由于Java不支持多重继承,所以到目前为止,还没有涉及到。适配器模式的优缺点
1.更好的复用性
2.更好的可扩展性
3.过多的使用适配器,会让系统非常凌乱,不容易整体进行把握-适配器模式的本质
适配器模式的本质是:转换匹配,复用功能-何时选用适配器模式
1.如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口
2.如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么就适配什么
3.如果你想使用一些已经存在的子类,但是不可能对每一个子类都进行适配,这种情况可以选用对象适配器,直接适配这些子类的父类就可以了
更多文章
http://www.runoob.com/design-pattern/adapter-pattern.html
http://blog.csdn.net/zhangjg_blog/article/details/18735243
http://blog.csdn.net/jason0539/article/details/22468457