オブジェクト指向の設計では、さまざまなオブジェクトへの動作の分散が促進され、オブジェクトがより小さな粒度に分割されるため、オブジェクトの再利用性が向上します。ただし、これらのきめの細かいオブジェクト間の接続が急増すると、再利用性が低下する可能性があります。
メディエーター パターンの役割は、オブジェクト間の密結合を緩和することです。
例:
携帯電話を購入するためのページを開発しているとします。購入プロセス中に、携帯電話の色を選択し、購入数量を入力すると、入力内容がそれに応じて表示されます。ページ。動的に次のステップを表示するボタンもあります(この色の在庫が十分であれば次のステップが表示され、そうでない場合は在庫が不足します)。
<p> <span>请选择颜色</span> <select id="selColor"> <option value="roseGold">玫瑰金</option> <option value="luxuryGold">土豪金</option> </select> </p> <p> <span>请输入购买数量:</span> <input type="text" id="selNum" /> </p> <p> <span>您选择的颜色为:</span><strong id="conColor"></strong> <span>您选择的数量为:</span><strong id="conNum"></strong> </p> <button id="nextBtn">加入购物车</button>
// 库存量 var goods = { roseGold: 10, luxuryGold: 10 }; var colorSelect = document.getElementById("selColor"), numberInput = document.getElementById("selNum"), colorInfo = document.getElementById("conColor"), numberInfo = document.getElementById("conNum"), nextBtn = document.getElementById("nextBtn"); colorSelect.onchange = function() { var color = colorSelect.value, // 颜色 number = +numberInput.value, // 数量 stock = goods[color]; // 对应颜色的库存量 colorInfo.innerHTML = color; if(!color) { nextBtn.disabled = true; nextBtn.innerHTML = "请选择手机颜色"; return; } if(!number || (((number - 0) | 0) !== (number - 0))) { nextBtn.disabled = true; nextBtn.innerHTML = "请选择手机数量"; return; } if( number > stock) { nextBtn.disabled = true; nextBtn.innerHTML = "库存不足"; return; } nextBtn.disabled = false; nextBtn.innerHTML = "加入购物车"; }; /* 购买数量做同样处理 */
携帯電話のメモリを表す別のドロップダウン リスト ボックスがページに追加されると、上記のコードは大きく変わります。
仲介モードの紹介
すべてのノードオブジェクトは仲介とのみ通信します。
ドロップダウン選択ボックス selColor、selMemory、またはテキスト ボックス selNum でイベントが発生した場合、メディエーターには変更されたことが通知されるだけであり、同時にパラメーターとしてメディエーターに渡されるため、メディエーターは誰が変更したかを識別でき、残りのことはメディエーター オブジェクトに任せて完了させます。
<p> <span>请选择颜色:</span> <select id="selColor"> <option value="roseGold">玫瑰金</option> <option value="luxuryGold">土豪金</option> </select> </p> <p> <span>请选择内存:</span> <select id="selMemory"> <option value="16G">16G</option> <option value="64G">64G</option> </select> </p> <p> <span>请输入购买数量:</span> <input type="text" id="selNum" /> </p> <p> <span>您选择的颜色为:</span><strong id="conColor"></strong> <span>您选择的内存为:</span><strong id="conMemory"></strong> <span>您选择的数量为:</span><strong id="conNum"></strong> </p> <button id="nextBtn">加入购物车</button>
// 库存量 var goods = { "roseGold|16G": 10, "roseGold|32G": 10, "luxuryGold|16G": 10, "luxuryGold|32G": 10 }; var colorSelect = document.getElementById("selColor"), memorySelect = document.getElementById("selMemory"), numberInput = document.getElementById("selNum"), colorInfo = document.getElementById("conColor"), memeryInfo = document.getElementById("conMemory"), numberInfo = document.getElementById("conNum"), nextBtn = document.getElementById("nextBtn"); var mediator = (function() { return { changed: function(obj) { var color = colorSelect.value, // 颜色 memory = memorySelect.value,// 内存 number = +numberInput.value, // 数量 stock = goods[color + '|' + memory]; // 对应颜色的库存量 if(obj === colorSelect) { colorInfo.innerHTML = color; }else if(obj === memorySelect) { memeryInfo.innerHTML = memory; }else if(obj === numberInput) { numberInfo.innerHTML = number; } if(!color) { nextBtn.disabled = true; nextBtn.innerHTML = "请选择手机颜色"; return; } if(!memory) { nextBtn.disabled = true; nextBtn.innerHTML = "请选择手机内存"; return; } if(!number || (((number - 0) | 0) !== (number - 0))) { nextBtn.disabled = true; nextBtn.innerHTML = "请选择手机数量"; return; } if( number > stock) { nextBtn.disabled = true; nextBtn.innerHTML = "库存不足"; return; } nextBtn.disabled = false; nextBtn.innerHTML = "加入购物车"; } }; })(); // 事件函数 colorSelect.onchange = function() { mediator.changed(this); }; memorySelect.onchange = function() { mediator.changed(this); }; numberInput.oninput = function() { mediator.changed(this); }
短所: 最大の欠点は、オブジェクト間の対話の複雑さが中間オブジェクトの複雑さに転送されるため、中間オブジェクトがシステムに追加されることです。多くの場合、中間オブジェクトは巨大で保守が困難です。
一般的に、オブジェクト間の複雑な結合により呼び出しや保守が困難になり、プロジェクトの変更に伴ってこれらの結合度が指数関数的に増加する場合は、メディエーター パターンを使用してコードをリファクタリングすることを検討できます。
以上がJavaScript Mediator パターンの定義とコードの参照方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。