以下这部分内容转载自https://segmentfault.com/a/1190000018682234
个人觉得简单通俗易懂。后半部分有Java适配器模式案例!!!
写在前面:
本文例子来自天龙八部,当年鸠摩智挑战少林寺高僧,声称自己学会七十二绝技,其实是用火焰刀,然后催动小无相功转换的虚假绝技,那么这里就体现了适配的用处,有点强行解释哈,不过原理差不多
target(目标): 七十二绝技
Adaptee(源): 火焰刀
Adapter(适配器): 小无相功
首先类适配器
代码实现:
目标七十二绝技
/**
* 少林七十二绝技
* Interface Qishier
*/
interface QishierTarget
{
public function jueji();
}
本身具有的武功火焰刀
/**
* 火焰刀的武功
* class HuoYanDaoAdaptee
*/
class HuoYanDaoAdaptee
{
public function huo(){
echo '使用火焰刀';
}
}
重点小无相功的适配器
继承了原来的火焰刀绝技,然后转换成了少林七十二绝技
/**
* 小无相功的适配器
* Class XwxgAdapter
*/
include_once "HuoYanDaoAdaptee.php";
include_once "QishierTarget.php";
class XwxgAdapter extends HuoYanDaoAdaptee implements QishierTarget
{
public function jueji()
{
parent::huo();
echo '转换成七十二绝技';
}
}
挑战少林寺
/**
* 鸠摩智使用
*/
include_once "XwxgAdapter.php";
$adapter = new XwxgAdapter();
$adapter->jueji();
言归正传,大家对基本概念有了解了吧,接下来进入主题:
根据适配器类和适配者类的关系,适配器模式可以分为以下两种:
对象适配器模式(组合的方式)
类适配器模式(继承的方式)
由于适配器模式有多种,下面通过几个代码片段来分别学习一下:
/**
* 目标接口
*/
public interface Target {
void request();
}
然后是我们的适配者类,同样这个好比是港版英标插头。
/**
* 适配者类
*/
public class Adaptee {
/**
* 客户期望使用的业务方法
*/
public void specificRequest(){
System.out.println("Adaptee Specific request!");
}
}
下面是适配器类,使用的是对象适配器模式,适配器类以组合的方式引用适配者类。这个就相当于电源接头转换器。
/**
* 适配器类(对象适配器模式实现)
*/
public class Adapter implements Target {
//以组合的方式关联适配者
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
public void setAdaptee(Adaptee adaptee) {
this.adaptee = adaptee;
}
/**
* 对接口进行转换
*/
@Override
public void request() {
adaptee.specificRequest();
}
}
而类适配器模式则是通过继承的方式,而Java语言只支持单继承,所以用得不多。
/**
* 类适配器模式
*/
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
specificRequest();
}
}
实际使用:
public class Client {
public static void main(String[]args){
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.request();
}
}
后半部分转自:https://www.jianshu.com/p/f57bd52a99df。