(一)模式概述
适配器模式是指将一个接口适配成用户所期待的新接口。该模式的宗旨是保留原有接口所提供的服务,且新接口能满足客户的期望。在实际应用中,会根据用户的需求来确定是为用户新增适配的新接口,还是修改原有接口实现适配(本文例子中均以新增接口为例)。适配器模式有两种实现方式:
1)类-适配器模式。指继承原接口的实体类,通过新增函数或重写旧函数实现接口适配。
2)对象-适配器模式。指实现原接口(非继承),新增函数或重写原方法来扩展。重点:将原接口的实体类通过对象的方式引用进来使用。
(二)模式结构
1)原接口
满足原客户端需求的接口
2)原实体类
实现原接口的对象
3)适配器实体类
在满足原接口依然可用情况下,适配出满足客户端新需求的对象
(三)Demo
类适配器模式
原接口:
public interface ISource {
/* 原接口 */
public void method();
}
原实体类:
public class Source {
public void method() {
System.out.println("this is method!");
}
}
现在由于用户扩展,原method接口已经不再满足用户需求,此时需要适配新接口addNewMethod,在ISource接口类新增接口如下
:
public interface ISource {
/* 原接口 */
public void method();
/* 新增适配接口 */
public void addNewMethod();
}
适配器实体类:
public class Adapter extends Source implements ISource{
@Override
public void addNewMethod() {
// TODO 自动生成的方法存根
System.out.println("this is new method!");
}
}
此时适配器继承原有的Source类并实现了ISource接口,重写新的接口方法addNewMethod以适配用户需求。
执行过程:
ISource adapter = new Adapter();
adapter.method();
adapter.addNewMethod();
直接结果:
this is method!
this is new method!
这样既满足了原有用户需求,又为需要适配的用户提供了实现方式。
对象适配器模式
对象适配器与类适配器唯一的不同就在于适配器的写法上,其他并无二致。
原接口:
public interface ISource {
/* 原接口 */
public void method();
/* 新增适配接口 */
public void addNewMethod();
}
原实体类:
public class Source {
public void method() {
System.out.println("this is method!");
}
}
适配器实体类(与类适配区别):
public class Adapter implements ISource {
private Source os; //将原实体类引入,不是继承
public Adapter(Source $os) {
os = $os;
}
@Override
public void method() {
os.method();
}
@Override
public void addNewMethod() {
System.out.println("this is new method!");
}
}
执行过程:
Source os = new Source();
ISource adapter = new Adapter(os);
adapter.method();
adapter.addNewMethod();
执行结果:
this is method!
this is new method!
(注)由于Java的单继承的,所以在实际应用中,使用对象适配器会更好。