结构性模式:适配器模式

2021-04-14  本文已影响0人  lifefruity

适配器模式是Adapter,也称Wrapper,是指如果一个接口需要B接口,但是待传入的对象却是A接口,怎么办?
所以引出定义适配器模式是指:定义一个类,将一个已经存在的类,转换成目标接口所期望的行为形式。

适配器模式有2种。一种适配对象,一种适配class(其实就是继承,但是有不好的点,就是会有多余的方法出来,比如220v的是不需要的,当前就应该只有5v的)

什么时候需要用适配器模式?只要记住一点。当你有动机修改一个已经投入生产的接口,这时候就可以考虑试用适配器模式。适配器模式是用于解决接口不兼容问题有效方法。

已220v电压转换为5v为例

  1. 对象适配器模式
/*
【适配器模式中主要角色】
目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所期待得到的
源(Adaptee)角色:需要进行适配的接口
适配器(Adapter)角色:对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类。
*/


//1. 对象适配器模式
/**
 * 目标角色
 */
interface Target {
    public function output5v();
}
 
/**
 * 源角色
 */
class Adaptee {
 
    /**
     * 源类含有的方法
     */
    public function output220v() {
        return 220;
    }
}
 
/**
 * 类适配器角色
 */
class Adapter implements Target {
    private $_adaptee;
 
    public function __construct(Adaptee $adaptee) {
        $this->_adaptee = $adaptee;
    }
 
    /**
     * 委派调用Adaptee的sampleMethod1方法
     */
    public function output5v() {
        $origin = $this->_adaptee->output220v();
        echo "原始电压是" .$origin. '当前是5v' . PHP_EOL;
    }
 
}
 

class Client {
    public static function main() {
        $adaptee = new Adaptee();
        $adapter = new Adapter($adaptee);//传入了一个不兼容的对象
        $adapter->output5v();
    }
}
Client::main();
  1. 类适配器模式(不推荐,把220v方法也暴露了)
<?php 

/**
 * 目标角色
 */
interface Target {
    public function output5v();
}
 
/**
 * 源角色
 */
class Adaptee {
 
    /**
     * 源类含有的方法
     */
    public function output220v() {
        return 220;
    }
}
 
/**
 * 类适配器角色
 */
class Adapter extends Adaptee implements Target {
    private $_adaptee;
 
    public function __construct(Adaptee $adaptee) {
        $this->_adaptee = $adaptee;
    }
 
    /**
     * 委派调用Adaptee的sampleMethod1方法
     */
    public function output5v() {
        $origin = $this->_adaptee->output220v();
        echo "原始电压是" .$origin. '当前是5v' . PHP_EOL;
    }
 
}
 

class Client {
    public static function main() {
        $adaptee = new Adaptee();
        $adapter = new Adapter($adaptee);//传入了一个不兼容的对象
        $adapter->output5v();
    }
}
Client::main();
上一篇 下一篇

猜你喜欢

热点阅读