簡介:
橋接模式又叫橋梁模式,屬于結構型模式,目的是將抽象與實作分離,使它們都可以獨立的變化,解耦,繼承有很多好處,但是會增加耦合,而橋接模式偏向組合和聚合的方式來共享,
適用場景:
不希望或不適用使用多繼承的場景,
一個類存在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();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/528065.html
標籤:其他
上一篇:Java 日志框架學習筆記
