1、 适配器模式(adapter)
(1)问题:解决不相容的接口问题或者说为具有不同接口的相似组件提供一个稳定的接口 ====>适配器模式:
将一个类的接口转换成客户希望的另外一个接口。
(2)解决方案:通过一个中间的适配器对象,使一个组件的原有接口转变成另一个接口
(3)
① 类适配器
② 对象适配器
(4)代码实现
Client.java 是原来的功能类(原项目)-------相当于你的手机
Target.java 是为原项目与外面连接提供的标准接口 -------你的手机充电头
Adaptee.java 是外来的项目,要通过接口与原来的项目连接,但是此项目与标准接口不匹配 ------香港的插座
Adapter.java 为了适应而提供的接口,将外来的项目与原来的接口连接起来 -------相当于香港与大陆插头转换器
Client.java 是原来的功能类
<span style="font-size:18px;"><span style="font-size:14px;">/**
* @author Administrator
* 客户端 (原来的项目),通过这两行代码即可实现与外来类Adaptee.java对接
*/
public class Client {
public static void main(String[] args) {
// Target 为原来的标准接口
// Target adapter = new Adapter1(); //对象适配器(通过对象来实现)
Target adapter = new Adapter2(); //类适配器(通过继承类来实现)
adapter.request(); //最终要实现的方法(外来项目的方法)
}
}</span></span>
<span style="font-size:18px;">//目标接口(为原项目与外部项目连接提供的标准接口)
public interface Target {
public void request();
}</span>
Adaptee.java 是外来的项目,要通过接口与原来的项目连接,但是此项目与标准接口不匹配
<span style="font-size:18px;">//已有类(外部功能类,原来项目要实现外部的功能类)
public class Adaptee {
public void specificRequest(){
System.out.println("这是已有类的功能");
}
}
</span>
①第一种方式:类适配器实现
<span style="font-size:18px;">/**
* @author Administrator
* 类适配器(新的接口Adapter2.java类,通过继承外来类
* 拥有外来类的方法,且实现Target接口)
*/
public class Adapter2 extends Adaptee implements Target {
@Override
public void request() {
super.specificRequest();
}
}
</span>
②第二种方式:对象适配器实现
<span style="font-size:18px;">/**
* @author Administrator
* 对象适配器(通过Adaptee属性来调用specificRequest()方法)
*/
public class Adapter1 implements Target{
private Adaptee adaptee; //外来类
public Adapter1(){
this.adaptee = new Adaptee(); //外来类
}
@Override
public void request() {
this.adaptee.specificRequest();
}
}</span>
2、 适配器模式引发了一个新的设计问题
由谁来创建Adapter呢?如何确定创建哪个Adapter子类?
例如,SAPAccountingAdapter 还是 GreatNorthernAccountingAdapter
(1)如果某些领域对象来创建Adapter,领域对象的职责将在考虑应用逻辑的同时,还要关注与外部服务构件的连通 性,而决定这种连通性又具有复杂的创建逻辑。
(2)按关注点分离的原则(separation of concerns),领域层的软件对象强调纯的应用逻辑职责,而关注与外部系 统连通性的职责由另一组对象承担。
因此,我们考虑由一个专门的对象来创建Adapter。----> Factory