パターン「スナップショット」

この投稿では、パターン「スナップショット」について説明します。または「メメント」

このパターンは「行動」を指します。デザインパターン。

グラフィック エディタを開発していて、ユーザー コマンドに基づいてアクションをロールバックする機能を追加する必要があるとします。このパターンを実装する場合、システム コンポーネントがロールバックされた「アクション」の内部状態にアクセスできないことも非常に重要です。他のシステム コンポーネントはスナップショット オブジェクトにのみアクセスでき、変更することはできません。内部状態を示し、明確でシンプルな外部インターフェイスを提供します。この問題を解決するには、「スナップショット」パターンが使用されます。または「キーパー」。

作品例「スナップショット」以下に示します:


クリックするとスプライトが表示され、カールした矢印をクリックするとアクションがキャンセルされます。スプライトが消えます。この例は 3 つのクラスで構成されています。

<オル>

  • スプライトとグラフィカル インターフェイスが表示されるキャンバス。
  • 画面コントローラー。クリックを処理し、画面のロジックを制御します。
  • 変更のたびに保持されるキャンバスの状態は、必要に応じて、画面コントローラを使用してロールバックされます。
  • パターン「スナップショット」のコンテキストでは、クラスは次のとおりです:

    <オル>

  • キャンバス–ソースでは、このクラスの状態は、後で要求に応じてロールバックできるように「スナップショット」として保存されます。また、ソースは「スナップショット」を転送するときに状態を復元できる必要があります。
  • コントローラー–管理者であるこのクラスは、状態を保存/ロールバックする方法とタイミングを知っています。
  • 状態–スナップショット。ソースの状態に加えて、ロールバック順序を正確に確立できる日付情報またはインデックスを保存するクラスです。
  • このパターンの重要な特徴は、ソースのみがスナップショット内の保存された状態の内部フィールドにアクセスできる必要があることです。これは、スナップショットを外部からの変更 (カプセル化をバイパスして何かを変更したい便利な開発者による) から保護するために必要です。システムロジックを破壊します)。カプセル化を実装するには、組み込みクラスが使用され、C++ ではフレンド クラスを指定する機能が使用されます。個人的には、Rise ではカプセル化を行わないシンプルなバージョンを実装し、Swift で実装する場合は Generic を使用しました。私のバージョンでは – Memento は、同じクラス状態のエンティティにのみ内部状態を与えます。

    ソース

    https://refactoring.guru/design-patterns/memento

    ソースコード

    https://gitlab.com/demensdeum/patterns/< /p>

    Leave a Comment

    Your email address will not be published. Required fields are marked *