<?php
/**
* 设计模式 一 适配器模式 Adapter(结构型模式)
*
* 定义:
* 1、将一个接口转换成为客户想要的另一个接口
* 2、使接口不兼容的那些类可以一起工作。
*/
/**
* 模式结构
* 1、目标抽象类(Target) 定义客户要用的特定领域的接口。
* 2、适配器(Adapter) 调用另一个接口,作为一个转换器。
* 3、被适配器(Adaptee) 定义一个接口,适配器需要接入。
* 4、客户端(Client) 请求调用适配器。
*/
/**
* 优缺点
* 1、优点 可以统一对象的访问接口。但其前提是不能或不想修改原来的适配器老接口。
* 2、缺点 客户调用可能需要变动,这时,修改起来比较麻烦。
*/
/**
* 下面主要介绍 对象适配器。 有兴趣的可以学习类适配器
*/
/**
* Target类 主要定义能够客户端使用的接口。
*/
abstract class Target {
public abstract getTemperature(); //气温
public abstract getPressure(); //气压
public abstract getHumidity(); //湿度
public abstract getUltraviolet(); //紫外线强度
}
/**
* 被适配的类Adaptee(Adaptee 中的接口由于不能被客户端识别,所有需要被适配)
*
*/
class Adaptee {
public function 得到温度() {
Console.WriteLine('您得到了今日的温度');
}
public function 得到气压() {
Console.WriteLine('您得到了今日的气压');
}
public function 得到湿度() {
Console.WriteLine('您得到了今日的湿度');
}
public function 得到紫外线强度() {
Console.WriteLine('您得到了今日的紫外线强度');
}
}
/**
* 适配器 将不能被客户端识别的接口间接转换为可以被识别的接口
*/
class Adapter extends Target {
public $adaptee;
public function __construct() {
$this->adaptee = new Adaptee(); //在适配器中必须要维护一个被适配器的对象。
}
// 通过适配器来适配原来不能被客户端所认识的接口
public function getTemperature() {
$this->adaptee.得到温度();
}
public function getPressure() {
$this->adaptee.得到气压();
}
public function getHumidity() {
$this->adaptee.得到湿度();
}
public function getUltraviolet() {
$this->adaptee.得到紫外线强度();
}
}
/**
* 客户端
*/
class client {
$target = new Adapter();
//下面的这些就是客户端可以被识别了接口了
$target->getTemperature();
$target->getPressure();
$target->getHumidity();
$target->getUltraviolet();
}
//可以看出,上面的适配器就是一个中介人,它把本来客户端的请求转换成了Adaptee 所代表的接口所能理解的请求。或者说是,把本来客户端不认识的 Adaptee 间接介绍给了客户端认识,不过注意是间接。