GoF类图
桥接模式
代码实现

interfaceImplementor{publicfunctionOperationImp();}classConcreteImplementorAimplementsImplementor{publicfunctionOperationImp(){echo'详细实现A',PHP_EOL;}}classConcreteImplementorBimplementsImplementor{publicfunctionOperationImp(){echo'详细实现B',PHP_EOL;}}
我们先来定义实现接口以及它们详细的实现,也便是真正要实行的功能。就像是适配器模式中的Adaptee。
abstractclassAbstraction{protected$imp;publicfunctionSetImplementor(Implementor$imp){$this->imp=$imp;}abstractpublicfunctionOperation();}classRefinedAbstractionextendsAbstraction{publicfunctionOperation(){$this->imp->OperationImp();}}
定义抽象类的接口,并掩护一个对实现的引用。详细的抽象类的实现方法中,我们直接调用实现接口的真实操作方法。类似于适配器中的Adapter。
$impA=newConcreteImplementorA();$impB=newConcreteImplementorB();$ra=newRefinedAbstraction();$ra->SetImplementor($impA);$ra->Operation();$ra->SetImplementor($impB);$ra->Operation();
客户端调用,我们的抽象类利用不用的实现类就可以让操作方法变成多态的觉得。
在源码阐明中,我们会创造,这个模式和适配器模式非常相似。但是,适配器的目的是为了帮助两个不太干系的类,让它们能够协同事情,实现中间转换事情。而桥接则是为了让方法的行为解除继续耦合,方便地添加、修正,动态调用行为,让抽象接口和实现部分可以独立进行改变让抽象接口和实现部分可以独立进行改变的意思是,只要掩护了实现接口的引用,我们的实现接口的详细实现类可以是完备不同的类,里面有不同的功能,并且可以任意改变。让实现来自己决定它自己是什么。桥接模式的优点:分享接口及实在现部分、提高可扩充性、实现细节对客户透明桥接模式最紧张办理的问题便是继续的不断增长而带来的紧耦合问题组合与聚合:聚合是弱关系,A可以包含B,但B不是A的一部分;组合是强关系,A包含B,B也是A的一部分,整体和部分的关系我们的手机有不同的型号,每个型号又要生产大致相同但不同的配件。比如X1手机壳、贴膜、耳机;X2的手机壳、贴膜、耳机等。受限于本钱的问题,我们不会给每一个型号的手机都去生产完备不一样的配套配件。而是去只管即便利用外部通用的配件(Implementor),让每一种型号的手机(Abstraction)去进行组合(Bridge),搭配售卖给消费者。这样,才不至于让我们的手机品牌太早的花费完融资关门大吉。看来,做企业和学设计模式还真是有很多干系之处哦!
!
完全代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/18.bridge/source/bridge.php
实例我们的短信发送也可以用桥接来实现。假设我们有很多的短信模板,然后搭配不同的短信供应商进行短信的发送。这时,我们就可以用桥接模式来形成各种不同的组合。
短信发送类图
短信发送功能桥接模式版
完全源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/18.bridge/source/bridge-message.php
<?phpinterfaceMessageTemplate{publicfunctionGetTemplate();}classLoginMessageimplementsMessageTemplate{publicfunctionGetTemplate(){echo'您的登录验证码是【AAA】,请不要透露给他人【XXX公司】!
',PHP_EOL;}}classRegisterMessageimplementsMessageTemplate{publicfunctionGetTemplate(){echo'您的注册验证码是【BBB】,请不要透露给他人【XXX公司】!
',PHP_EOL;}}classFindPasswordMessageimplementsMessageTemplate{publicfunctionGetTemplate(){echo'您的找回密码验证码是【CCC】,请不要透露给他人【XXX公司】!
',PHP_EOL;}}abstractclassMessageService{protected$template;publicfunctionSetTemplate($template){$this->template=$template;}abstractpublicfunctionSend();}classAliYunServiceextendsMessageService{publicfunctionSend(){echo'阿里云开始发送短信:';$this->template->GetTemplate();}}classJiGuangServiceextendsMessageService{publicfunctionSend(){echo'极光开始发送短信:';$this->template->GetTemplate();}}//三个短信模板$loginTemplate=newLoginMessage();$registerTemplate=newRegisterMessage();$findPwTemplate=newFindPasswordMessage();//两个短信服务商$aliYun=newAliYunService();$jg=newJiGuangService();//随意组合//极光发注册短信$jg->SetTemplate($registerTemplate);$jg->Send();//阿里云发登录短信$aliYun->SetTemplate($loginTemplate);$aliYun->Send();//阿里云发找回密码短信$aliYun->SetTemplate($findPwTemplate);$aliYun->Send();//极光发登录短信$jg->SetTemplate($loginTemplate);$jg->Send();//......
解释
这便是一种聚合模式。模板并不是短信发送的一部分,我们不该用模板直接发送也可以,它们没有强关系短信发送商的发送方法无需改变,只须要传入不同的短信模板就可以实现各种模板的快速发送在不愿定是否一定是is-a的关系的情形下,更推举用桥接模式这种组合/聚合形式的设计方法,如果确定当前的类关系是is-a,那么就不要犹豫的用继续吧下期看点上次提到过虚拟机软件的桥接管集模式,它的浸染是类似于把物理主机虚拟为一个交流机,所有桥接设置的虚拟机连接到这个交流机的一个接口上,物理主机也同样插在这个交流机当中,以是所有桥接下的网卡与网卡都是交流模式的,相互可以访问而不滋扰。实在和我们的设计模式很相似,将抽象工具看做是虚拟交流机,实现类便是虚拟机,通过工具的引用作为网线将它们连接在一起。看着大略的模式但想深入理解也是挺困难的吧?特殊是它与其他模式很类似的时候。下回我们讲的门面模式也是这样,很好理解,但转头一想又会以为跟其他一些模式很相似,以是,还是须要深入的理解才能更好的节制这些模式,话不多说,下回见!