设计模式之三--适配器模式

 

以下这部分内容转载自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。
 

你可能感兴趣的:(设计模式之三--适配器模式)