意味リクエストをオブジェクトとしてカプセル化することで、異なるリクエストを持つ他のオブジェクトをパラメーター化したり、リクエストをキューに登録したりログに記録したり、元に戻せる操作をサポートしたりできるようになります。 「コマンド パターン」は「リクエスト」をオブジェクトにカプセル化することで、元に戻す操作をサポートしながら、他のオブジェクトを異なるリクエスト、キュー、またはログを使用してパラメータ化できるようにします。 ここでの「リクエスト」の定義は、フロントエンドでよく言われる「Ajax リクエスト」ではなく、アクションを開始することを意味する「アクション リクエスト」です。たとえば、リモコンを使ってテレビの電源を切るときは、「電源を切って」がリクエストになります。コマンド パターンでは、リクエストをコマンドに抽象化します。このコマンドは再利用可能で、受信者 (テレビ) のみを考慮します。アクションの開始側 (リモコン) は、サポートするコマンドのみを考慮しますが、これらのコマンドが具体的に何を行うかは考慮しません。 構造コマンド パターンのクラス図は次のとおりです。 このクラス図には、5 つの役割があります。
レシーバーとインボーカーは結合されておらず、機能拡張が必要な場合は新しいコマンドが追加されます。そのため、コマンドモードはオープンクローズ原則に準拠しています。 例カスタムショートカットキーショートカット キーのカスタマイズは、エディターの最も基本的な機能です。コマンド パターンを使用すると、キーの位置とキー ロジックを切り離す構造を記述できます。 インターフェースコマンド{ 実行():void } タイプ Keymap = { [キー:文字列]: コマンド } クラスホットキー{ キーマップ: キーマップ = {} コンストラクタ(キーマップ: キーマップ) { this.keymap = キーマップ } 呼び出し(e: キーボードイベント) { 定数プレフィックス = e.ctrlKey ? 'ctrl+' : '' 定数キー = プレフィックス + e.key this.dispatch(キー) } ディスパッチ(キー: 文字列) { this.keymap[キー].exec() } } クラスCopyCommandはCommandを実装します{ コンストラクタ(クリップボード: 任意) {} 実行() {} } CutCommandクラスはCommandを実装します{ コンストラクタ(クリップボード: 任意) {} 実行() {} } PasteCommandクラスはCommandを実装します{ コンストラクタ(クリップボード: 任意) {} 実行() {} } const クリップボード = { データ: '' } 定数キーマップ = { 'ctrl+x': 新しいCutCommand(クリップボード)、 'ctrl+c': 新しいCopyCommand(クリップボード)、 'ctrl+v': 新しい PasteCommand(クリップボード) } const hotkey = 新しい Hotkey(キーマップ) document.onkeydown = (e) => { ホットキー.call(e) } この場合、ホットキーが呼び出し側で、クリップボードが受信者になります。既存のキーマップを変更する必要がある場合は、既存のキーまたはコマンドを追加または置き換えるだけです。 この書き方はお馴染みだと思いますか?はい、Redux もコマンド モードを適用します。Store は Receiver に相当し、Action は Command に相当し、Dispatch は Invoker に相当します。 元に戻すとやり直しコマンド パターンに基づいて、元に戻すとやり直しをサポートするように簡単に拡張できます。 インターフェース IPerson { moveTo(x: 数値, y: 数値): void } クラスPersonはPersonを実装します{ x = 0 y = 0 移動先(x: 数値, y: 数値) { this.x = x this.y = y } } インターフェースコマンド{ 実行(): 無効 元に戻す(): 無効 } MoveCommandクラスはCommandを実装します{ 前X = 0 前 = 0 人: 人 コンストラクタ(人: Person) { this.person = 人 } 実行() { this.prevX = this.person.x this.prevY = this.person.y this.person.moveTo(this.prevX++、this.prevY++) は、 } 元に戻す(){ this.person.moveTo(this.prevX, this.prevY) } } const ezio = 新しい Person() const moveCommand = 新しい MoveCommand(ezio) 移動コマンド.exec() コンソールログ(ezio.x、ezio.y) 移動コマンド.undo() コンソールログ(ezio.x、ezio.y) 録音と再生ゲーム内の録画と再生機能について考えてみましょう。キャラクターの各アクションをコマンドと見なすと、録画中に一連のコマンド キューを取得できます。 クラスコントロール{ コマンド: コマンド[] = [] exec(コマンド) { this.commands.push(コマンド) コマンド.exec(this.person) } } const ezio = 新しい Person() const コントロール = 新しいコントロール() control.exec(新しいMoveCommand(ezio)) control.exec(新しいMoveCommand(ezio)) console.log(コントロールコマンド) コマンド キューがあれば、複数の元に戻す操作とやり直し操作を簡単に実行し、コマンド履歴を実現できます。現在のコマンド キューのポインターを移動するだけです。 クラスコマンド履歴 { コマンド: コマンド[] = [] インデックス = 0 現在のコマンドを取得します(){ this.commands[index]を返す } コンストラクター(コマンド: Command[]) { this.commands = コマンド } やり直し(){ this.index++ this.currentCommand.exec() } 元に戻す() { this.currentCommand.undo() this.index-- } } 同時に、コマンドをオブジェクトにシリアル化すると、保存や送信に使用できるようになります。このようにして、リモート コンピューターに送信し、ezio の動きをリモート制御する機能を実現できます。 [{ タイプ: '移動'、 x: 1, y: 1, }, { タイプ: '移動'、 x: 2, y: 2, }] マクロコマンドに対して簡単な処理を行うことで、既存のコマンドを組み合わせて実行し、マクロコマンドとして使用することができます。 クラスBatchedCommandはCommandを実装します{ コマンド = [] コンストラクタ(コマンド) { this.commands = コマンド } 実行() { this.commands.forEach(コマンド => command.exec()) } } const batchedMoveCommand = 新しいBatchedCommand([ 新しいMoveCommand(ezio)、 新しいSitCommand(ezio)、 ]) バッチ化されたMoveCommand.exec() 要約する上記の例から、コマンド モードには次の特性があることがわかります。
以上がJavascript実践におけるコマンドモードの詳細な説明です。Javascriptコマンドモードの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: 一般的な MySQL ストレージ エンジンとパラメータ設定およびチューニングの紹介
MySQL のインデックスの種類一般的に、次の 4 つのカテゴリに分類できます。通常のインデックス:...
MySQLとMariaDBの関係MariaDB データベース管理システムは MySQL のブランチで...
表> <TR> <TD> <TH> <キャプション&...
各人が固有の携帯電話番号で登録し、ビジネス コードによって重複する携帯電話番号が 2 つ書き込まれな...
目次1. これは2. この点を修正する1. call() メソッド2. apply() メソッド要約...
<br />フレーム構造により、ブラウザの 1 ページに複数の Web ページを同時に表...
1 MySQL5.6 1.1 関連パラメータMySQL 5.6 では、innodb_undo_dir...
雇用主から MySQL クエリ条件でインデックスが使用されるかどうかを尋ねられた場合、どのように答え...
序文vue3 を使った例をいくつか書いてみましたが、Vue3 のコンポジション API はよく設計さ...
目次1. 関連構成ケース1(使用ツールはvue-cil)ケース2(使用するツールはwebpack) ...
序文起源は質問 1 です: umask が 022 に設定されている場合、作成するファイルのデフォル...
前面に書かれた今日のインターネット分野では、Nginx は最も広く使用されているプロキシ サーバーの...
最近、ポップアップ広告に取り組んでいました。デフォルト ページには z-index が設定されていな...
Nginx (エンジン x) は、軽量で高性能な HTTP およびリバース プロキシ サーバーであり...
CSS3以前は、グラデーション画像は背景画像としてのみ使用できました。 CSS3 のグラデーション構...