1. ホーム
  2. スクリプト・コラム
  3. ゴラン

goによるアダプタパターンの実装

2022-01-07 12:58:03

アダプターパターン

定義

アダプターパターンの英訳はAdapter Design Patternで、その名の通り、互換性のないインターフェースを互換性のあるインターフェースに変換し、インターフェースに互換性がないために一緒に動作しないクラスが一緒に動作できるようにするための適応に使われるパターンである。

例として

今の新しいパソコンにはUSB-Cポートがありますが、今使っているマウスやキーボードはレガシーUSBポートなので使えないので、インターフェース用のアダプターを買うのですが、そのアダプターがデザインモードのアダプターなんですね。

コードの実装

help(tf.contrib.legacy_seq2seq.sequence_loss_by_example)


テストファイル

Hilfe zur Funktion sequence_loss_by_example im Modul tensorflow.contrib.legacy_seq2seq.python.ops.seq2seq:

sequence_loss_by_example(logits, targets, weights, average_across_timesteps=True, softmax_loss_function=None, name=None)
    Gewichteter Kreuzentropieverlust für eine Folge von Logits (pro Beispiel).
    
    Args:
      logits: Liste von 2D-Tensoren der Form [batch_size x num_decoder_symbols].
      Ziele: Liste von 1D int32 Tensoren in Stapelgröße mit der gleichen Länge wie logits.
      Gewichte: Liste von 1D batch-sized float-Tensoren der gleichen Länge wie logits.
      average_across_timesteps: Falls gesetzt, werden die zurückgegebenen Kosten durch das gesamte
        Label-Gewicht.
      softmax_loss_function: Funktion (Labels, Logits) -> zu verwendende Verlustmenge
        anstelle des Standard-Softmax (Standardwert, wenn dieser Wert auf None gesetzt ist). **Beachten Sie, dass
        um Verwechslungen zu vermeiden, ist es erforderlich, dass die Funktion benannte
        Argumente zu akzeptieren.**
      name: Optionaler Name für diese Operation, Standard: "sequence_loss_by_example".
    
    Rückgabe:
      1D batch-sized float Tensor: Die Log-Perplexität für jede Sequenz.
    
    Erzeugt:
      ValueError: Wenn len(logits) von len(targets) oder len(weights) verschieden ist.


以下、簡単に説明します。

1. AudioPlayerはあるのですが、mp3しか再生できません。

2、AudioPlayerでmp3とvlcも再生できるようにしたい。

3. MediaAdapterを導入し、サポートされていない機能をアダプターを通して処理する。AudioPlayerの場合は、MediaAdapterを呼び出すだけで、様々な再生フォーマットで音声を再生することが可能です。

4. MediaAdapter は、様々なフォーマットをラップし、同じ呼び出しメソッドで異なるフォーマットのオーディオを使用できるようにします。

構造図を表示する

プロフェッショナル

1. 無関係な2つのクラスを一緒に実行させることができます。

2. クラスの再利用性を向上させる。

3. クラスの透明性を高める。

4. 柔軟性が良い。

デメリット

アダプタを多用すると、システムが非常に細分化され、全体が把握しづらくなることがある

一般に、アダプター・パターンは、設計上の欠陥を補うための「補償パターン」とも言える。もし、設計の初期段階でインターフェースの非互換性を回避するように調整していれば、使われることはなかったであろう、quot;no-brainer"パターンである。

このパターンを多用する場合、設計に大きな問題があり、リファクタリングを検討する必要があるかもしれない

アプリケーションの範囲

1. 欠陥のあるインターフェース設計のカプセル化

2、複数のクラスのインターフェイス設計を統一する

3、依存する外部システムのリプレース

4. 旧バージョンのインターフェースと互換性がある

5、異なるフォーマットのデータへの対応

プロキシ、ブリッジ、デコレーター、アダプターの4つのデザインパターンの違い

Proxyパターン。Proxyパターンは、元のクラスのインターフェイスを変更せずに、そのクラスのプロキシクラスを定義するパターンである。主な目的はアクセス制御であり、機能拡張ではないので、decoratorパターンとの最大の違いはここである。

Bridgingパターン。ブリッジングパターンの目的は、インターフェイス部分と実装部分を分離し、より簡単に、比較的独立して変更できるようにすることである。

デコレーターパターン。デコレーターパターンは、元のクラスのインターフェイスを変更せずに機能を拡張するもので、複数のデコレーターの入れ子利用をサポートする。

Adapterパターン。Adapter パターンは、事後的な修正戦略である。Adapterパターンは元のクラスと異なるインターフェイスを提供し、ProxyパターンやDecoratorパターンは元のクラスと同じインターフェイスを提供する。

参考文献

[インテキスト・コード https://github.com/boilingfrog/design-pattern-learning/tree/master/适配器模式
[デザインパターンについて大いに語る】。] https://book.douban.com/subject/2334288/
[ギーク・タイム】。] https://time.geekbang.org/column/intro/100039001
[ルーキーチュートリアル】をご覧ください。] https://www.runoob.com/design-pattern/adapter-pattern.html
[ポエムアダプターモード]。 https://boilingfrog.github.io/2021/11/14/使用go实现适配器模式/

以上、goを使ってadapterパターンを実装する方法について解説しました。go の adapter パターンに関する詳細については、過去の記事を検索するか、引き続き以下の関連記事を参照してください。