适配器模式:把一个类的接口变换成客户端所期待的另外一个接口,使接口不兼容的那些类可以一起工作,这样的做法像是货物的包装过程,因此也被成为包装模式。
适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。在类的适配器模式中,适配器与适配者之间是继承(或实现)的关系,如下图所示,类的适配器模式包括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等。
Sign:人生不要有太多的幻想,而要有更多的行动。
1136

被折叠的 条评论
为什么被折叠?



