桥接模式-

<?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();//敌人看到地刺了,地刺继续攻击敌人

?>

用途总结:桥接模式可以将基本的实现和具体的调用类分开,调用类可以扩展更复杂的实现。

实现总结:需要一些基本执行类,实现基本的方法,比如上面的两个钻地类。同时我们可以设计多个不同的扩展调用类,将基本的功能扩展,比如地刺和小狗就进一步实现了不同的在地下的行为。

原文地址:https://www.cnblogs.com/jiufen/p/5000819.html