ブリッジ パターン:
抽象部分を実装部分から分離して、独立して変更できるようにします。これはオブジェクト構造パターンであり、ハンドルとボディ パターンまたはインターフェイス パターンとも呼ばれます。
ブリッジモードには以下の役割が含まれます:
Abstraction: 抽象クラス
RefinedAbstraction: 拡張抽象クラス
Implementor: 実装クラスインターフェース
ConcreteImplementor: 具体的な実装クラス
UML 図:
ブリッジパターンを理解するには、重要なのは、抽象的な抽象化と実装がどのように分離され、独立して変更できるかを理解することです。
抽象化: 抽象化とは、一部の情報を無視し、異なるエンティティを同じエンティティとして扱うことです。オブジェクト指向では、オブジェクトの共通プロパティを抽出してクラスを形成するプロセスが抽象化のプロセスです。
実現化: 抽象化に対して与えられる具体的な実現化は実現化です。
デカップリング: デカップリングとは、抽象化と実装の間の結合を切り離すこと、またはそれらの間の強い関連を弱い関連に変更し、2 つの役割間の継承関係を関連関係に変更することです。ブリッジ モードにおけるいわゆるデカップリングとは、ソフトウェア システムの抽象化と実装の間の継承関係の代わりに関連関係 (組み合わせまたは集約関係) を使用することを指します。これにより、この 2 つは比較的独立して変更できます。これがブリッジ モードです。意図。
利点:
抽象インターフェイスとその実装部分を分離します。
ブリッジ モードは多重継承スキームに似ている場合もありますが、多重継承スキームはクラスの単一責任原則に違反し (つまり、クラスの変更理由は 1 つだけです)、再利用性が比較的低く、多重継承構造内のクラスは非常に大きいため、ブリッジ パターンは多重継承ソリューションよりも優れたソリューションです。
ブリッジ モードは、元のシステムを変更することなく、2 つの変化する次元のうちの 1 つを任意に拡張できます。
実装の詳細は顧客に対して透過的であり、ユーザーに対して非表示にすることができます。
デメリット:
ブリッジモードの導入により、システムの理解と設計が難しくなります。集約関係は抽象化層で確立されるため、開発者は抽象化に向けた設計とプログラミングを行う必要があります。 - ブリッジ モードでは、システム内で独立して変化する 2 つの次元を正確に識別する必要があるため、その使用範囲には一定の制限があります。
システムがコンポーネントの抽象的な役割と具体的な役割の間に柔軟性を追加する必要があり、2 つのレベル間の静的な継承リンクの確立を回避する必要がある場合、ブリッジ モードでそれらを抽象層に関連付け関係を確立することができます。 。
抽象ロールと実装ロールは、相互に影響を与えることなく継承により独立して拡張できる プログラム実行時に、抽象サブクラスのオブジェクトと実装サブクラスのオブジェクトを動的に組み合わせることができる、つまりシステムが動的に抽象化する必要がある。役割と実装の役割を組み合わせます。
クラスには 2 つの独立して変化する次元があり、両方の次元を拡張する必要があります。
システム内で継承を使用しても問題ありませんが、抽象的な役割と具体的な役割は独立して変更する必要があるため、設計要件では両者を独立して管理する必要があります。
ブリッジ モードは、継承を使用したくないシステム、またはマルチレベル継承によりシステム クラスの数が大幅に増加するシステムに特に適しています。
<?php//抽象化角色,抽象化给出的定义,并保存一个对实现化对象的引用。abstract class Abstraction { /* 对实现化对象的引用 */ protected $imp; //其操作方法 public function operation() { $this->imp->operationImp(); }}//修正抽象化角色,扩展抽象化角色,改变和修正父类对抽象化的定义。class RefinedAbstraction extends Abstraction { public function __construct(Implementor $imp) { $this->imp = $imp; } //操作方法在修正抽象化角色中的实现 public function operation() { echo 'RefinedAbstraction operation '; $this->imp->operationImp(); }} //实现化角色,给出实现化角色的接口,但不给出具体的实现。abstract class Implementor { //操作方法的实现化声明 abstract public function operationImp();} //具体化角色A,给出实现化角色接口的具体实现class ConcreteImplementorA extends Implementor { //操作方法的实现化实现 public function operationImp() { echo 'Concrete implementor A operation <br />'; }} //具体化角色B 给出实现化角色接口的具体实现class ConcreteImplementorB extends Implementor { //操作方法的实现化实现 public function operationImp() { echo 'Concrete implementor B operation <br />'; }}
具体的な例:
//实现各种操作系统都能播放MPEG,AVI,WMV格式的视频//抽象类,定义操作系统abstract class OperationSystem{ public $musicParren; function playMpeg(){ $this->musicParren->playMpeg(); } function playWmv(){ $this->musicParren->playWmv(); } function playAvi(){ $this->musicParren->playAvi(); }}//扩展抽象类,定义Linux的播放模式class linux extends OperationSystem{ function __construct(MusicParren $musicParren){ $this->musicParren = $musicParren; }}//扩展抽象类,定义Linux的播放模式class Windows extends OperationSystem{ function __construct(MusicParren $musicParren){ $this->musicParren = $musicParren; }}//扩展抽象类,定义Unix的播放模式class Unix extends OperationSystem{ function __construct(MusicParren $musicParren){ $this->musicParren = $musicParren; }}//实现类接口abstract class MusicParrenInterface{ abstract function playMpeg(); abstract function playWmv(); abstract function playAvi();}//具体实现类class MusicParren extends MusicParrenInterface{ function playMpeg(){ echo "播放Mpeg格式的视频"; } function playWmv(){ echo "播放Wmv格式的视频"; } function playAvi(){ echo "播放Avi格式的视频"; }}//测试$operationSystem = new Windows(new MusicParren());$operationSystem->playMpeg();$operationSystem->playAvi();