适配器模式
定义
在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(英语:wrapper)。将一个类的接口转接成用户所期待的另一个接口,从而使得原本因接口不匹配而无法在一起工作的两个类能够在一起工作。做法是将类自己的接口包裹在一个已存在的类中。
示例与代码
//定义被适配的对象
class Speaker{
public String speak() {
return "I can only speak english!"
}
}
//定义转换器接口,也就是适配之后需要实现的功能
interface Translator{
public String trnslate();
}
//实现适配器有两种方式,一种是通过继承被适配对象;一种是通过引用被适配对象,这里使用第二种
class SpeakerAdapter implements Translator {
private Speaker speaker;
public SpeakerAdapter(Speaker speaker) {
this.speaker = speaker;
}
@override String translate() {
String result = speaker.speak;
//进行翻译...
return result;
}
}
//使用
public class Main {
public static void main(String[] args) {
new SpeakerAdapter(new Speaker()).translate();
}
}
适配器的作用就是将一个接口适配到另一个接口。在 JAVA的IO类库中有很多这样的需求,如将字符串数据转变成字节数据保存到文件中,将字节数据转变成流数据等。
下面以InputStreamReader和OutputStreamWriter 类为例介绍适配器模式。 InputStreamReader 和 OutputStreamWriter 分别继承Reader和Writer两个抽象类,但是要创建它们的对象必须在构造函数中传入一个 InputStream和 OutputStream 的实例。InputStreamReader 和 OutputStreamWriter 也就是将 InputStream和 OutputStream适配到Reader和Writer
适配器模式与装饰器模式的区别
装饰器与适配器都有一个别名叫做 包装模式(Wrapper),它们看似都是起到包装一个类或对象的作用,但是使用它们的目的很不一样。适配器模式的意义是要将一个接口转变成另一个接口,它的目的是通过改变接口来达到重复使用的目的。 而装饰器模式不是要改变被装饰对象的接口,而是恰恰要保持原有的接口,但是增强原有对象的功能,或者改变原有对象的处理方式而提升性能。所以这两个模式设计的目的是不同的。