桥接模式-
<?php //虫族的基础类 class Zerg { //实现钻地的基本对象 public $imp; //负责切换钻地基本对象的方法 public function setImp($imp) { $this->imp = $imp;//$this->imp接收的是一个实例化后的Implementor接口下的具体对象 } //部队的钻地方法,可以扩展基本对象的钻地 public function underground() { $this->imp->underground();//这个underground()来自Implementor接口中的方法 } } //小狗的类 class Zergling extends Zerg { /*调用基本的钻地方法,然后实现扩展,这里简单的echo 这个方法很灵活,除了在这里实现功能,还能继承父类的方法, 而且,父类的这个方法中实现的是什么,是由另外一个对象-方法传过来的*/ public function underground() { parent::underground(); echo '现在地刺钻地了,小狗不能动<br>'; } } //地刺的类 class Lurker extends Zerg { //调用基本的钻地方法,然后实现扩展,这里简单的echo public function underground() { parent::underground(); echo '现在地刺钻地了,能够进行攻击<br>'; } } //钻地的基本接口 interface Implementor { //基本的钻地方法 public function underground(); } //隐形钻地的基本类 class InvisibleImp implements Implementor { //基本的钻地方法 public function underground() { echo '钻地,不可见<br>'; } } //不隐形钻地的基本类,比如玩家自己看到的或被探测到的 class VisibleImp implements Implementor { //基本的钻地方法 public function underground() { echo '钻地,可见<br>'; } } /*测试*/ $z1 = new Zergling();//造一个小狗 $z1->setImp(new InvisibleImp());//小狗钻地功能由钻地类在小狗的父类中设置,并在小狗钻地方法中继承 $z1->underground();//这里的underground()是Zergling类中的方法 echo '<hr>'; $l1 = new Lurker();//造一个地刺 $l1->setImp(new InvisibleImp()); $l1->underground(); echo '<hr>'; $l1->setImp(new VisibleImp());//敌人急了,马上飞过来一个科技球,查看隐身物体 $l1->underground();//敌人看到地刺了,地刺继续攻击敌人 ?>
用途总结:桥接模式可以将基本的实现和具体的调用类分开,调用类可以扩展更复杂的实现。
实现总结:需要一些基本执行类,实现基本的方法,比如上面的两个钻地类。同时我们可以设计多个不同的扩展调用类,将基本的功能扩展,比如地刺和小狗就进一步实现了不同的在地下的行为。