您的位置:首页 > 其它

【设计模式】适配器模式

2015-04-20 23:11 197 查看
适配器模式:把一个类的接口变换成客户端所期待的另外一个接口,使接口不兼容的那些类可以一起工作,这样的做法像是货物的包装过程,因此也被成为包装模式。

适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。在类的适配器模式中,适配器与适配者之间是继承(或实现)的关系,如下图所示,类的适配器模式包括3个角色。



目标角色定义了客户所需的接口,适配者是现有需要适配的接口,由图可见,Adaptee没有方法operation2,需要适配,适配器Adapter作为转换器对Adaptee和Target进行适配。

具体代码如下:

public interface Target{
public void operation1();
public void operation2();
}
public class Adaptee{
public  void operation1(){}
}
public class Adapter extends Adaptee implements Target{
//因为Adaptee没有这个方法,因此在适配器上补充该方法
public void operation2(){
// do something
}
}


由于Java、C#等语言不支持多重继承,因此类适配器模式的使用受到限制,所以在实际应用当中对象适配器模式的使用频率更高。

对象适配器模式与类适配器模式一样,把被适配的类的API转换成为目标类的API。所不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类的,而是使用委派关系连接到Adaptee类。同样对象适配器模式也包含3个角色:



在这里,Adapter类包装了一个Adaptee类的实例,从而把Adaptee的API与Target类的API连接起来,Adapter与Aadptee是委派关系。

具体代码如下:

public interface Target{
public void operation1();
public void operation2();
}
public class Adaptee{
public  void operation1(){}
}
public class Adapter implements Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
super();
this.adaptee = adaptee;
}
public void operation1(){
adaptee.operation1();//Adaptee中有该方法,所以适配器直接委派operation1()
}
public  void operation2(){
// do something
}
}


缺省适配器模式

缺省适配器模式是适配器模式的一种变形,应用也很广泛。当不需要实现一个接口提供的所有方法时,可以先设计一个抽象类实现该接口,并为接口的每个方法提供一个默认的实现(空方法),这样抽象类的子类就可以根据需要去覆盖父类的某些方法,而不需要实现所有的方法。

缺省适配器模式包含3个角色,分别是:

适配器接口:一个声明了大量方法的接口。

缺省适配器类:是一个实现了适配器接口的抽象类。

具体业务类:继承缺省适配器类,是缺省适配器类的子类,根据业务需求去覆盖父类的方法。

一个经典的例子:JDK类库中的事件处理包java.awt.event中就广泛使用了缺省适配器模式,如:MouseAdapter、KeyAdapter等。

Author:立礼

Sign:人生不要有太多的幻想,而要有更多的行动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: