概要:
该文章参考了《设计模式之禅》一书及一些前辈的博客文章
1.该文章阐述了适配器模式的基础原理及示例代码;
2.该文章适合初学设计模式的技术人员研习;
3.该文章有许多不足之处,请各位大咖指正,喷子绕道;
正文:
适配器模式(变压器模式、包装模式):将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
1.适配器模式示例代码实现:
package com.csdn2;
/**
* HDMI线
* @author Administrator
*
*/
public interface HdmiLine {
//通过HDMI线传递数据
public void getComputerInfoByHDMI();
}
package com.csdn2;
/**
* HDMI接口
* @author Administrator
*
*/
public class HDMI implements HdmiLine {
@Override
public void getComputerInfoByHDMI() {
System.out.println("通过HDMI接口输出数据中...");
}
}
package com.csdn2;
/**
* DVI线
* @author Administrator
*
*/
public interface DviLine {
//通过DVI线传递数据
public void getComputerInfoByDVI();
}
package com.csdn2;
/**
* DVI接口
* @author Administrator
*
*/
public class DVI implements DviLine {
@Override
public void getComputerInfoByDVI() {
System.out.println("通过DVI接口输出数据中...");
}
}
package com.csdn2;
/**
* 适配器
* @author Administrator
*
*/
public class Adapter extends DVI implements HdmiLine{
//适配器将DVI输出转换为HDMI输出
public void getComputerInfoByHDMI(){
System.out.println("添加了将DVI接口转换为HDMI接口的转换头,实际还是由DVI接口输出数据");
super.getComputerInfoByDVI();
}
}
package com.csdn2;
/**
* 模拟显示器接收数据
* @author Administrator
*
*/
public class Monitor {
public static void main(String[] args) {
//一条HDMI连接线,直接连接了电脑的HDMI数据输出接口
HdmiLine hdmiLine = new HDMI();
//HDMI连接线传输数据
hdmiLine.getComputerInfoByHDMI();
System.out.println("<--------->");
//一条HDMI连接线,通过DVI转HDMI的转换头连接着电脑的DVI数据输出接口
HdmiLine hdmiLine2 = new Adapter();
//HDMI连接线传输数据
hdmiLine2.getComputerInfoByHDMI();
}
}
输出:
通过HDMI接口输出数据中...
<--------->
添加了将DVI接口转换为HDMI接口的转换头,实际还是由DVI接口输出数据
通过DVI接口输出数据中...
注:
a:该示例讲述了实际生活中某个人的电脑显卡上有HDMI接口和DVI接口,而显示器只有HDMI接口,该人还拥有一根HDMI线和一个DVI转HDMI的转换头,他可以选择使用(显卡HDMI接口—HDMI线—显示屏HDMI接口)的方式对2者进行连接,也可以选择通过(显卡DVI接口—DVI转HDMI转换头—HDMI线—显示屏HDMI接口)的方式对2者进行连接,其中这里的转换头,就是适配器模式的核心角色。
b:适配器模式拥有目标角色、源角色、和适配器角色三个角色。
c:实例中通过继承进行的适配,叫做类适配器,类适配器是类间继承。
d:通过委托进行的适配,叫做对象适配器,它的委托是通过对象层次的关联关系进行委托的,一般适用于与外界多个实现类通讯。
2:通用适配器模式模板代码实现:
package com.csdn;
/**
* 目标角色
* @author Administrator
*
*/
public interface Target {
//目标角色自己的方法
public void request();
}
package com.csdn;
/**
* 目标角色实现类
* @author Administrator
*
*/
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("if you need any help,pls call me!");
}
}
package com.csdn;
/**
* 源角色
* @author Administrator
*
*/
public class Adaptee {
//原有业务逻辑
public void doSomething(){
System.out.println("I'm kind of busy,leave me alone,pls!");
}
}
package com.csdn;
/**
* 适配器角色
* @author Administrator
*
*/
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.doSomething();
}
}
package com.csdn;
/**
* 场景类
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
//原有业务逻辑
Target target = new ConcreteTarget();
target.request();
//增加适配器之后业务逻辑
Target target2 = new Adapter();
target2.request();
}
}
输出:
if you need any help,pls call me!
I'm kind of busy,leave me alone,pls!