ブリッジ パターンの定義:
抽象化を実装から切り離し、独立して変更できるようにします。
ブリッジモードの構造図:
ブリッジモードの役割:
Abstraction(抽象化)の役割: 与えられた定義を抽象化し、実装されたオブジェクトへの参照を保存します。
洗練された抽象化ロール: 抽象化ロールを拡張し、親クラスによる抽象化の定義を変更および修正します。
実装者ロール: このロールはロールを実装するためのインターフェイスを提供しますが、特定の実装は提供しません。このインターフェイスは、抽象ロールのインターフェイス定義と必ずしも同じではないことに注意してください。実際、2 つのインターフェイスは大きく異なる場合があります。実装されたロールは低レベルの操作のみを提供する必要がありますが、抽象ロールは低レベルの操作に基づいた高レベルの操作のみを提供する必要があります。
例と組み合わせる:
テレビのリモコンの例を挙げます。リモコンの各ブランドには、制御する対応するリモコンがあります。現時点で私たちが考えるデザインは、リモコンのインターフェイスを抽象化することです。 、内部 電源オン、電源オフ、チャンネル変更などの一連の機能メソッドを実装する必要があります。次に、このインターフェイスを継承し、内部のメソッドを実装する特定のリモート コントロール クラスを作成します。これにより、各テレビが独自のリモコンを実装できるようになり、新しいタイプのテレビの場合は、新しいリモコンの派生を満たす派生クラスを追加するだけで済みます。しかしある日、ユーザーがリモコンの前のチャネルに戻る関数の追加を要求した場合、抽象リモコン インターフェイスを変更する必要があり、新しいメソッドを抽象クラスに追加する必要があるため、実装が変更されます。抽象クラスの。ユーザーがテレビの製品動作とリモコンの動作を同時に変更することを要求した場合、上記の設計は大幅に変更されることになります。ブリッジ モードを使用すると、これらの問題をうまく解決できます。
使用法:
1. まずテレビを抽象化し、リモコンの動作メソッドを変更します。
/// <summary> /// 电视机,提供抽象方法 /// </summary> public abstract class TV { public abstract void On(); public abstract void Off(); public abstract void tuneChannel(); }
2. 抽象 TV クラスから継承した具体的な TV を作成します。
/// <summary> /// 三星牌电视机,重写基类的抽象方法 /// </summary> public class Samsung:TV { public override void On() { Console.WriteLine("三星牌电视机已经打开了"); } public override void Off() { Console.WriteLine("三星牌电视机已经关掉了"); } public override void tuneChannel() { Console.WriteLine("三星牌电视机换频道"); } } /// <summary> /// 长虹牌电视机,重写基类的抽象方法 /// 提供具体的实现 /// </summary> public class ChangHong : TV { public override void On() { Console.WriteLine("长虹牌电视机已经打开了"); } public override void Off() { Console.WriteLine("长虹牌电视机已经关掉了"); } public override void tuneChannel() { Console.WriteLine("长虹牌电视机换频道"); } }
3. 次に、概要内のリモコンを抽象化し、抽象的な単語の役割を果たします。
/// <summary> /// 抽象概念中的遥控器,扮演抽象化角色 /// </summary> public abstract class RemoteControl { public TV implementor { get; set; } /// <summary> /// 开电视机 /// 这里抽象类中不再提供实现了,而是调用实现类中的实现 /// </summary> public virtual void On() { implementor.On(); } /// <summary> /// 关电视机 /// </summary> public virtual void Off() { implementor.Off(); } /// <summary> /// 换频道 /// </summary> public virtual void SetChannel() { implementor.tuneChannel(); } }
4. 特定のリモート コントロール クラスを作成します。ここでは、チャネルを変更するメソッドを書き換えました。実際には、他のメソッドも書き換えることができます。
/// <summary> /// 具体遥控器类 /// </summary> public class ConcreteRemote:RemoteControl { /// <summary> /// 重写更换频道方法 /// </summary> public override void SetChannel() { Console.WriteLine("重写更换频道方法"); base.SetChannel(); } }
5. 呼び出し:
static void Main(string[] args) { // 创建一个遥控器 RemoteControl remoteControl = new ConcreteRemote(); //长虹电视机 remoteControl.implementor = new ChangHong(); remoteControl.On(); remoteControl.SetChannel(); remoteControl.Off(); Console.WriteLine(); // 三星牌电视机 remoteControl.implementor = new Samsung(); remoteControl.On(); remoteControl.SetChannel(); remoteControl.Off(); Console.Read(); }
このようにして、リモート コントロールの機能実装メソッドは、リモート コントロールに実装されるのではなく、実装によって実現されます。リモート コントロールには TV クラスへの参照のみが含まれており、ブリッジ モードを通じて抽象化部分と実装部分を分離することで、これら 2 つの側面の変更に適切に対処できます。
利点:
抽象インターフェースはその実装から分離されており、抽象化と実装は相互に影響を与えることなく独立して拡張できます。
短所:
システムが複雑になります。
使用シナリオ:
1. 2 つのレベル間の静的な接続の確立を避けるために、システムがコンポーネントの抽象的な役割と具体的な役割の間に柔軟性を追加する必要がある場合
2. 役割への変更は次のとおりです。クライアントに影響を与えないか、実装されたロールへの変更はクライアントに対して完全に透過的である必要があります。
3. 複数のプラットフォームにまたがる必要があるグラフィックスとウィンドウ システム
4. クラスには 2 つの独立して変化する次元があり、両方の次元を拡張する必要があります。
以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。