🤷♂️
デザインパターン:Proxyパターン
これは何?
電話で宅配便の再配達依頼をするときの自動音声案内システム
何が嬉しいのか
アクセス過多を解消できる(アクセス・コントロール / 保護プロキシー)
ログが取れるなど
問題
カスタマーセンターには毎日たくさんの再配達依頼が届く。
半端ないストレスに担当者が疲れてしまい、マニュアルモンスターが誕生する。
/*-----------------------------------------------------------
* カスタマーセンターのマニュアル
*-----------------------------------------------------------*/
class ServiceCenterManual {
greetingTemplate() {
throw new Error('greetingTemplate method must be implemented');
}
responseToCustomer(request) {
throw new Error('requestRedelivery method must be implemented');
}
}
/*-----------------------------------------------------------
* カスタマーセンターのマニュアルモンスター
*-----------------------------------------------------------*/
class ServiceCenter extends ServiceCenterManual {
greetingTemplate() {
console.log("はい、こちらはカスタマーセンターです。")
console.log("ご用件をお伺いいたします。")
}
responseToCustomer(request) {
return `${request}ですね。承りました!`;
}
}
/*-----------------------------------------------------------
* マニュアルモンスターの電話対応
*-----------------------------------------------------------*/
const deliveryService = new RealDeliveryService();
deliberService.greetingTemplate()
// イライラモンスターのリクエスト
let redeliveryResponse = deliveryService.responseToCustomer("わかるだろコラ!");
console.log(redeliveryResponse);
解決
共通のマニュアル(インターフェース)を元に自動音声案内システム(プロキシ)を導入して、担当者がパンクしないように問い合わせ数をコントロールする。
/*-----------------------------------------------------------
* 自動音声案内システム(プロキシ)
*-----------------------------------------------------------*/
class ServiceCenterProxy extends ServiceCenterManual {
constructor() {
this.serviceCenter = new ServiceCenter();
}
greetingTemplate() {
this.serviceCenter.greetingTemplate();
console.log("再配達の依頼の方は1を、それ以外の方は2を押してください。")
console.log("1を押した場合、その後にお荷物番号を入力してください。")
console.log("2を押した場合、担当者にお繋ぎいたします。")
}
responseToCustomer(request) {
return this.serviceCenter.responseToCustomer(request);
}
}
その他の推しポイント
色々なProxyがある
-
遅延初期化(仮想プロキシ)
重いオブジェクト作成を必要になるまで遅延させる
-
アクセス・コントロール(保護プロキシ)
今回の事例
-
リモート・サービスのローカル実行(リモート・プロキシ)
ローカル環境のDB管理ツールを使用し、リモートサーバーのDB操作を行うようなもの
-
ロギング・リクエスト(ロギング・プロキシ)
サービスを動かしたときのアクセスログみたいなやつとったり
-
リクエスト結果のキャッシュ(キャッシング・プロキシ)
リクエストの結果を一時的に保存し、同じリクエストが来たらキャッシュを返す
動く実装例
Discussion