Gof23设计模式中是这样定义桥接设计模式:桥接模式的目的是把抽象层次结构从其实现中分离出来,使其能够独立变更。抽象层定义了供客户端使用的上层的抽象接口。实现层次结构定义了供抽象层次使用的底层接口。实现类的引用被封装于抽象类的实例中时,桥接就形成了。
我们用一个游戏的例子去理解这个桥接模式,比如,我们假如魂斗罗一代,魂斗罗二代界面没多大变化,可以共用一套底层接口。
上面这个图:左侧部分Abstraction是抽象类,右侧部分是实现类。
按照定义,实现类应该是实现具体的底层接口,我们都知道魂斗罗能左走(left),向右走(right),趴下(down),跳(up),那么所谓的底层接口,就是实现这几种动作的函数或者方法。抽象类是一个封装,抽象类Abstraction会引用实现类Implemement,因为客户端直接调用抽象类里面的方法。
我们设想一个这样的情形,假如游戏玩家按了跳的动作,假设Abstraction中有一个setComment:的方法,那么程序中应该这样去实现【abstraction setComment:top】,具体方法:
{
【imp top】;
}
这样就实现了两个的桥接。
【1】,不想在抽象与其实现之间形成固定的绑定关系。
【2】,抽象和实现类都可以通过子类进行扩展。
【3】,对抽象的实现进行修改不影响客户端的代码。
【4】,想在带有不同的抽象中共用一个实现。
<?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();
设计模式【7】:桥接模式【接口适配】,布布扣,bubuko.com
原文:http://blog.csdn.net/jijunyuan/article/details/26348993