适配器模式用于适配两个不同接口,结合两个独立接口的功能。
何时使用:
1. 系统需要使用现有的类,而此类的接口不符合系统的需要。
2. 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
3. 通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)如何解决:继承或依赖(推荐)。
适配器不是在详细设计时添加的,而是解决正在服役的项目的问题
举个栗子,中国和英国使用了不同类型的插座标准。创建两个接口表示中英不同的插座,创建两个实现类,实现中英不同插座的充电功能。
//创建中英不同标准的插座
interface ukSocket{
public function ukcharge();
}
interface cnSocket{
public function cncharge();
}
//实现类,实现中英不同插座的充电功能
class cnCharger implements cnSocket{
public function cncharge(){
echo 'charging using China type charger.<br>';
}
}
class ukCharger implements ukSocket{
public function ukcharge(){
echo 'Charging using UK type charger.<br>';
}
}
去英国旅游,想给手机充电,需要一个中英转换的适配器。适配器需要实现英式的充电方式,和中式的插座。
class cnAdapter implements ukSocket{
private $cnsocket;
public function __construct(){
$this->cnsocket = new cnCharger();
}
public function ukcharge(){
return $this->cnsocket->cncharge();
}
}
英国的酒店提供了英式插座。充电时,需要拿出我的中英适配器,接到英国酒店的插座上,进行充电。
class ukhotel{
private $socket;
public function __construct($socket){
$this->socket = $socket;
}
public function charge(){
$this->socket->ukcharge();
}
}
$adpater = new cnAdapter();
$ukhotel = new ukhotel($adpater);
$ukhotel->charge();
//测试结果:
//charging using China type charger.