首页 > 代码库 > 设计模式【7】:桥接模式【接口适配】

设计模式【7】:桥接模式【接口适配】

1,定义

Gof23设计模式中是这样定义桥接设计模式:桥接模式的目的是把抽象层次结构从其实现中分离出来,使其能够独立变更。抽象层定义了供客户端使用的上层的抽象接口。实现层次结构定义了供抽象层次使用的底层接口。实现类的引用被封装于抽象类的实例中时,桥接就形成了。


我们用一个游戏的例子去理解这个桥接模式,比如,我们假如魂斗罗一代,魂斗罗二代界面没多大变化,可以共用一套底层接口。

上面这个图:左侧部分Abstraction是抽象类,右侧部分是实现类。

按照定义,实现类应该是实现具体的底层接口,我们都知道魂斗罗能左走(left),向右走(right),趴下(down),跳(up),那么所谓的底层接口,就是实现这几种动作的函数或者方法。抽象类是一个封装,抽象类Abstraction会引用实现类Implemement,因为客户端直接调用抽象类里面的方法。

我们设想一个这样的情形,假如游戏玩家按了跳的动作,假设Abstraction中有一个setComment:的方法,那么程序中应该这样去实现【abstraction setComment:top】,具体方法:

{

  【imp top】;

}

这样就实现了两个的桥接。

2,何时使用桥接模式?

【1】,不想在抽象与其实现之间形成固定的绑定关系。

【2】,抽象和实现类都可以通过子类进行扩展。

【3】,对抽象的实现进行修改不影响客户端的代码。

【4】,想在带有不同的抽象中共用一个实现。

3,一个php例子

<?php 
/** 
* 桥接模式 
* 
* 将抽象部份与它实现部分分离,使用它们都可以有独立的变化 
*/ 
abstract class Implementor 
{ 
abstract public function operation(); 
} 
class ConcreteImplementorA extends Implementor 
{ 
public function operation() 
{ 
echo “ConcreteImplementorA Operation<br/>”; 
} 
} 
class ConcreteImplementorB extends Implementor 
{ 
public function operation() 
{ 
echo “ConcreteImplementorB Operation<br/>”; 
} 
} 
class Abstraction 
{ 
protected $_implementor = null; 
public function setImplementor($implementor) 
{ 
$this->_implementor = $implementor; 
} 
public function operation() 
{ 
$this->_implementor->operation(); 
} 
} 
class RefinedAbstraction extends Abstraction 
{ 
} 
class ExampleAbstraction extends Abstraction 
{ 
} 
// 
$objRAbstraction = new RefinedAbstraction(); 
$objRAbstraction->setImplementor(new ConcreteImplementorB()); 
$objRAbstraction->operation(); 
$objRAbstraction->setImplementor(new ConcreteImplementorA()); 
$objRAbstraction->operation(); 
$objEAbstraction = new ExampleAbstraction(); 
$objEAbstraction->setImplementor(new ConcreteImplementorB()); 
$objEAbstraction->operation();