php教程下载(PHP进阶教程-设计模式之桥接模式)PHP教程 / PHP进阶教程...

wufei123 发布于 2024-06-06 阅读(9)

​桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。

这两种类型的类可被结构化改变而互不影响意图可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。解决问题通过组合的方式解决多继承违背类的单一原则问题。UML图

该模式中包含的角色及其职责抽象化(Abstraction)定义抽象类,并包含一个对实现化对象的引用,构造方法规定子类需要传入一个实现对象(Implementor)该类通常定义为一个抽象类扩展抽象化(RefinedAbstraction)。

是抽象化角色(Abstraction)的子类,实现并完善父类中的业务方法,并通过组合关系调用实现化角色中的业务方法实现化(Implementor)定义实现化角色的接口,供扩展抽象化角色调用,定义实现维度的基本操作,提供给抽象化(Abstraction)使用。

该类通常定义为一个接口或者抽象类具体实现化(ConcreteImplementor)实现化角色接口(Implementor)的具体实现。在本例子中:

优缺点优点分离抽象接口及其实现部分桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。

桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统实现细节对客户透明,可以对用户隐藏实现细节缺点桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进。

应用场景如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用接口或抽象类不稳定的场景。

案例背景举一个例子:一家汽车品牌的车通常都是会有多款车型和多款颜色,这里车型和颜色就是两个不同的具体实现,例如宝马3系可以有蓝色和红色,宝马5系一样可以有蓝色跟红色当然实现方法可以有多种每一种车型针对不同的颜色创建不同的类,如 BMW3Read 和 BMW3Blue;BMW5Read 和 BMW5Blue。

如果一天添加一个7系呢?BMW7Read 和 BMW7Blue,还是要这样写根据车型和颜色组合实现,如:BMW3($red) 和 BMW3($blue);BMW5($red) 和 BMW5($blue)。

添加7系也只需要 BMW7($red) 和 BMW7($blue) 就好了两种方式可以进行对比一下,第一种方式每款车型的颜色都需要具体的一个类实现,车型里面的内容无法复用,BMW3Read和BMW3Blue都需要重写一遍。

细心的同学已经看到了可以通过继承实现对吧把公共的方法抽离出来放到 BMW3 这个类中,然后 BMW3Read 和 BMW3Blue 都去继承,这样的确可以实现但是PHP和JAVA等语言都是单继承的,如果需要继承 BMW 这个品牌呢?怎么办?。

这时候我们可以采用第二种方式来实现,通过组合的方式,这样就可以用解决这个单继承的问题了示例代码CarAbstraction.php 汽车抽象,抽象化(Abstraction)interfaceCarAbstraction。

{ publicfunction__construct(ColorImplementor $implementor); publicfunctiongetCar(); }ColorImplementor.php 颜色实现,实现化(Implementor)

interfaceColorImplementor{ publicfunctiongetColor(); }BMW3RefinedAbstraction.php 3系汽车具体实现,扩展抽象化(RefinedAbstraction)

classBMW3RefinedAbstractionimplementsCarAbstraction{ private $implementor; publicfunction__construct

(ColorImplementor $implementor){ $this->implementor = $implementor; } publicfunction

getCar(){ return sprintf("%s----%s",$this->implementor->getColor(),"宝马3系"); } }BMW5RefinedAbstraction.php 5系汽车具体实现,扩展抽象(RefinedAbstraction)

classBMW5RefinedAbstractionimplementsCarAbstraction{ private $implementor; publicfunction__construct

(ColorImplementor $implementor){ $this->implementor = $implementor; } publicfunction

getCar(){ return sprintf("%s----%s",$this->implementor->getColor(),"宝马5系"); } }RedConcreteImplementor.php 红色实现,具体实现化(ConcreteImplementor)

classRedConcreteImplementorimplementsColorImplementor{ publicfunctiongetColor(){ return"红色"

; } }BlueConcreteImplementor.php 蓝色实现,具体实现化(ConcreteImplementor)classBlueConcreteImplementorimplements

ColorImplementor{ publicfunctiongetColor(){ return"蓝色"; } }调用代码:$red = new RedConcreteImplementor();

//创建红色 $blue = new BlueConcreteImplementor();//创建蓝色 $bmw3Red = new BMW3RefinedAbstraction($red);//创建红色宝马3系

$bmw3Blue = new BMW3RefinedAbstraction($blue);//创建蓝色宝马3系 $bmw5Red = new BMW5RefinedAbstraction($red);

//创建红色宝马5系 $bmw5Blue = new BMW5RefinedAbstraction($blue);//创建蓝色宝马5系echo $bmw3Red->getCar() . "\n"; echo

$bmw3Blue->getCar() . "\n"; echo $bmw5Red->getCar() . "\n"; echo $bmw5Blue->getCar() . "\n";输出结果:红色----宝马3系

蓝色----宝马3系 红色----宝马5系 蓝色----宝马5系更多文章关注微信公众号:IT不是挨踢

如果觉得文章还不错,请把文章分享给更多的人学习,在文章中发现有误的地方也希望各位指出更正。现有误的地方也希望各位指出更正。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻9763