.NETブリッジモードの説明

Dec 20, 2016 pm 12:57 PM
ブリッジモード

ブリッジ パターンの定義:

抽象化を実装から切り離し、独立して変更できるようにします。

ブリッジモードの構造図:

.NETブリッジモードの説明

ブリッジモードの役割:

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 サイトをサポートしていただければ幸いです。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語で特殊文字を処理する方法 C言語で特殊文字を処理する方法 Apr 03, 2025 pm 03:18 PM

C言語では、以下などのエスケープシーケンスを通じて特殊文字が処理されます。\ nはラインブレークを表します。 \ tはタブ文字を意味します。 ESACEシーケンスまたは文字定数を使用して、Char C = '\ n'などの特殊文字を表します。バックスラッシュは2回逃げる必要があることに注意してください。さまざまなプラットフォームとコンパイラが異なるエスケープシーケンスを持っている場合があります。ドキュメントを参照してください。

C文字列におけるcharの役割は何ですか C文字列におけるcharの役割は何ですか Apr 03, 2025 pm 03:15 PM

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

C言語でさまざまなシンボルを使用する方法 C言語でさまざまなシンボルを使用する方法 Apr 03, 2025 pm 04:48 PM

c言語のシンボルの使用方法は、算術、割り当て、条件、ロジック、ビット演算子などをカバーします。算術演算子は基本的な数学的操作に使用されます。割り当てと追加、下位、乗算、除算の割り当てには、条件操作に使用されます。ポインター、ファイル終了マーカー、および非数値値。

マルチスレッドと非同期C#の違い マルチスレッドと非同期C#の違い Apr 03, 2025 pm 02:57 PM

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C言語のcharとwchar_tの違い C言語のcharとwchar_tの違い Apr 03, 2025 pm 03:09 PM

C言語では、charとwchar_tの主な違いは文字エンコードです。CharはASCIIを使用するか、ASCIIを拡張し、WCHAR_TはUnicodeを使用します。 Charは1〜2バイトを占め、WCHAR_Tは2〜4バイトを占有します。 charは英語のテキストに適しており、wchar_tは多言語テキストに適しています。 CHARは広くサポートされており、WCHAR_TはコンパイラとオペレーティングシステムがUnicodeをサポートするかどうかに依存します。 CHARの文字範囲は限られており、WCHAR_Tの文字範囲が大きく、特別な機能が算術演算に使用されます。

C言語でCharを変換する方法 C言語でCharを変換する方法 Apr 03, 2025 pm 03:21 PM

C言語では、charタイプの変換は、キャスト:キャスト文字を使用することにより、別のタイプに直接変換できます。自動タイプ変換:あるタイプのデータが別のタイプの値に対応できる場合、コンパイラは自動的に変換します。

C言語でchar配列の使用方法 C言語でchar配列の使用方法 Apr 03, 2025 pm 03:24 PM

Char Arrayは文字シーケンスをC言語で保存し、char array_name [size]として宣言されます。アクセス要素はサブスクリプト演算子に渡され、要素は文字列のエンドポイントを表すnullターミネーター「\ 0」で終了します。 C言語は、strlen()、strcpy()、strcat()、strcmp()など、さまざまな文字列操作関数を提供します。

C言語合計の機能は何ですか? C言語合計の機能は何ですか? Apr 03, 2025 pm 02:21 PM

C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

See all articles