简介:

桥接模式又叫桥梁模式,属于结构型模式。目的是将抽象与实现分离,使它们都可以独立的变化,解耦。继承有很多好处,但是会增加耦合,而桥接模式偏向组合和聚合的方式来共享。

适用场景:

不希望或不适用使用多继承的场景。
一个类存在2个或更多的 独立变化维度 , 并且这些维度都需要 独立扩展

优点:

解耦抽象和具体实现,方便增加抽象和实现。优秀的扩充能力
符合开闭原则和合成复用原则。

缺点:

增加了系统的理解与设计难度。
需要正确地识别出系统中,两个独立变化的维度。

扩展:

为什么要用桥接模式?
先说说继承:
如果有一个手机类作为父类A,下面有各个牌子的手机作为子类B,又有每个牌子手机旗下的内置应用类C。此时如果有3个手机的牌子,那么内置应用的父类可能有30个。
如果因为需求变需要增加手机品牌B,或者接着有第四层的D类继承第三层的内置应用类,想想这个是多么庞大的数量。后期难以维护。如果一旦父级发生变动,株连很多子类。
其实按照合成复用原则,也就是少用继承(强耦合),多用组合(弱耦合)或者聚合(中耦合)
以上的问题,可以直接拆分成两个大模块:
手机类作为抽象,手机牌子作为具体的类。
内置软件可单独抽象,每一个内置的软件作为具体的类。
然后让让两个抽象进行牵线搭桥,这边是桥接模式的思路。

案例代码:

abstract class Mobile {
    abstract public function operate();
}

class HuaWei extends Mobile {
    public function operate() {
        echo '华为手机';
    }
}

class Vivo extends Mobile {
    public function operate() {
        echo 'Vivo手机';
    }
}


Abstract class Abstraction {
    protected $implementer;
    public function setImplementer ($implementer) {
        $this->implementer = $implementer;
    }

    public function run() {
        $this->implementer->operate();
    }
}


class HuaWeiApp extends Abstraction {
    public function run() {
        $this->implementer->operate();
    }
}

class VivoApp extends Abstraction {
    public function run() {
        $this->implementer->operate();
    }
}


//调用端
$ab = new HuaWeiApp();
$ab->setImplementer(new HuaWei);
$ab->run();

$ab = new VivoApp();
$ab->setImplementer(new Vivo);
$ab->run();

抽象代码:

//创建一个实现
abstract class Implementer {
    abstract public function operate();
}

class ImplementerA extends Implementer {
    public function operate() {
        echo 'ImplementerA';
    }
}

class ImplementerB extends Implementer {
    public function operate() {
        echo 'ImplementerB';
    }
}


Abstract class Abstraction {
    protected $implementer;
    //用组合的方式替代继承
    public function setImplementer (Implementer $implementer) {
        $this->implementer = $implementer;
    }

    public function run() {
        $this->implementer->operate();
    }
}

class RefinedAbstraction extends Abstraction {
    public function run() {
        $this->implementer->operate();
    }
}

//调用端============================================================
$ab = new RefinedAbstraction();
$ab->setImplementer(new ImplementerA());
$ab->run();

$ab->setImplementer(new ImplementerB());
$ab->run();

原文地址:http://www.cnblogs.com/phpphp/p/16864740.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性