php設計模式之橋接模式

橋接模式

把抽象化與實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬于結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。將抽象部分與實現部分分離,使它們都可以獨立的變化。在有多種可能會變化的情況下,用繼承會造成類爆炸問題,擴展起來不靈活。實現系統可能有多個角度分類,每一種角度都可能變化。把這種多角度分類分離出來,讓它們獨立變化,減少它們之間耦合。

目錄結構

|facade  #項目根目錄
|--Think  #核心類庫
|----main
|------road.php  #抽象公路角色
|------car.php  #抽象汽車接口
|----highSpeedRoad.php  #具體公路實現者 高速路
|----nationalRoad.php  #具體公路實現者 國道
|----sportsCar.php  #具體汽車車實現者 跑車
|----homeCar.php  #具體汽車實現者 家轎
|----Loder.php  #自動加載類
|--index.php #單一的入口文件

代碼實踐

抽象公路角色 Think/main/road.php

<?php
/**
 * 抽象公路角色
 */
namespace Think\main;

abstract class road{
    protected $_car;
    abstract function run();

    public function __construct(car $car) {
        $this->_car = $car;
    }
}

抽象汽車接口 Think/main/car.php

<?php
/**
 * 抽象汽車接口
 */
namespace Think\main;

interface car{
    function run();
}

具體公路實現者 高速路 Think/highSpeedRoad.php

<?php
/**
 * 具體公路實現者 高速路
 */
namespace Think;

use Think\main\road;

class highSpeedRoad extends road{
    public function run() {
        $this->_car->run();
        echo '開在高速路上'.PHP_EOL;
    }
}

具體公路實現者 國道 Think/nationalRoad.php

<?php
/**
 * 具體公路實現者 國道
 */
namespace Think;

use Think\main\road;

class nationalRoad extends road{
    public function run() {
        $this->_car->run();
        echo '開在國道上'.PHP_EOL;
    }
}

具體汽車車實現者 跑車 Think/sportsCar.php

<?php
/**
 * 具體汽車車實現者 跑車
 */
namespace Think;

use Think\main\car;

class sportsCar implements car{
    public function run() {
       echo "跑車";
    }
}

具體汽車實現者 家轎 Think/homeCar.php

<?php
/**
 *  具體汽車實現者 家轎
 */
namespace Think;

use Think\main\car;

class homeCar implements car{
    public function run() {
        echo '家轎';
    }
}

自動加載類 Think/Loder.php

<?php
namespace Think;

class Loder{
    static function autoload($class){
        require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
    }
}

入口文件index.php

<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');


//讓跑車開在高速公路上
$highSpeedRoad = new \Think\highSpeedRoad(new \Think\sportsCar());
$highSpeedRoad->run();
//讓家轎開在國道上
$nationalRoad = new \Think\nationalRoad(new \Think\homeCar());
$nationalRoad->run();

輸出

跑車開在高速路上
家轎開在國道上

優點: 1、抽象和實現的分離。 2、優秀的擴展能力。 3、實現細節對客戶透明。

缺點:橋接模式的引入會增加系統的理解與設計難度,由于聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計與編程。

使用場景: 1、如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。 2、對于那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。 3、一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展。

注意事項:對于兩個獨立變化的維度,使用橋接模式再適合不過了。

上一篇 php設計模式之外觀模式
下一篇 未完待續......

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1 場景問題# 1.1 發送提示消息## 考慮這樣一個實際的業務功能:發送提示消息。基本上所有帶業務流程處理的系統...
    七寸知架構閱讀 5,062評論 5 63
  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,961評論 1 15
  • 【學習難度:★★★☆☆,使用頻率:★★★☆☆】直接出處:橋接模式梳理和學習:https://github.com/...
    BruceOuyang閱讀 928評論 0 2
  • 在正式介紹橋接模式之前,我先跟大家談談兩種常見文具的區別,它們是毛筆和蠟筆。假如我們需要大中小3種型號的畫筆,能夠...
    justCode_閱讀 1,785評論 0 7
  • 跟你說個嚴肅的事。 恩,你說吧。 我們分手吧! 為什么? 沒有為什么,沒有理由。 已經和前女友分手四個半月了,從當...
    身穿禮服的黑烏鴉閱讀 340評論 0 0