🤷‍♂️

デザインパターン:Proxyパターン

2024/04/08に公開

これは何?

電話で宅配便の再配達依頼をするときの自動音声案内システム

何が嬉しいのか

アクセス過多を解消できる(アクセス・コントロール / 保護プロキシー)

ログが取れるなど

問題

〇〇郵便には毎日たくさんの再配達依頼が届く。

半端ないストレスに担当者が壊れてしまい、マニュアルモンスターが誕生する。

/*-----------------------------------------------------------
 * サービスセンターのマニュアル
 *-----------------------------------------------------------*/
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操作を行うようなもの

  • ロギング・リクエスト(ロギング・プロキシ)

    サービスを動かしたときのアクセスログみたいなやつとったり

  • リクエスト結果のキャッシュ(キャッシング・プロキシ)

    リクエストの結果を一時的に保存し、同じリクエストが来たらキャッシュを返す

動く実装例

https://www.typescriptlang.org/play?#code/PQKgtBldO38KgKAAQhYVoZA-DIZYZCdDIN0MgzwyD9DFoHYMgewyDTDIKcMgRQyDXDKuIm+x3CMEgMYA2AQwDOwlAGUApgCcAbgEtekgMKSAdgBcZAWUFqAroP4oA3qhQWA5tMmSN8tZYAqkgLYAHIVoAUASlPmFkEoGgAW0gD2AO4oapIxAKLSkdLeAOTWtvaOLh5ekiiudqERACaF+sIaKABGBfJ5bupapWm+ANyBKAC+SF02wu4RasKSThHKlRoRRak2AI76klUAXOIa0g6W-mbBwWGRMXGJyRGpaQtLVQBKkqWS-PKyMgCehcVlFVW19Y1Fmnc2p1gr1ekhQJxIVDECxMLhCKQKDQGIxAEcMRDwZBY0JxuIg3D4QlEEhkCiUqgB0hQkgAHlo1KUxFI5IoVM0dHpDPxdkFMnYtrlPIIfDsusFeMNhBF+JIAHT8CKWbwAIkA9gyAEQZAIAMgGUGQCGDIBIhlVgHAGI2AV4TAP3ygHMGQCaDIAgBmVvjFQQlI2lcoVSuVgBUGQAUroA3uUASQyAKQZAFzy6sA6gyAPwY7Q6umDggMhiMxhMpjMZN5LssNGsNltRXsgjYNPppGoUAADAAkJizVW6NsAtgy2wD+RoAohkj4cA+gyAQH+K8CgqC+hC8aPOLDAOsMgFuGQC1DIB2hmxY6XiAJAhETNJrIpWmkAAVIjS3rT6YySSzyezpLoDEYzKNz2zKSsz2THzuBxYXVVpPpeNNUgWhYoMI+juBmHROhYYTyMIsr3q+24yCgAC8sTxC+W6Xn4H49H0wR8tkzhuEKIoBEBIShDBcGbhelKygRArEfk2FIAAkOxrFfm68qKiqgCxioAsomACoJ5CALnygA8GeQgCdpqqgCI-wGmqALoMgAxDIAp3KAGia0mqoASP8BoAPUbhoAZgyAPIMgAGDIAqgzqvajocZxkrcR6KryQZXaACwagAQKkp5CADH6gDWDEGgDuwYAlk6AFaugDvygGgCmioA2UpGWZlnWWxHFcTKPGerpLkeZqgCjRoAyvqAKAB-mANJ+gByDOqXZRjGjognhRbLEmozjJMVTpnMkiLNmuabI4gGFsWpbltBsHwZhdGJpKKbNdMsyZu1VwaBBNVgiOy6rTAk6znO5CAN9pgCOUYAf9qADv6i5rad+I8F+1QjbRO77hEh4oWhMTMghl53YeLHXW+MjvS89E2PyORMcKkgseCwAoIJQmKYA8Qyw+imIUIAVwyAPUMgAVDHggATDEgMrVDY9yPM80gvLcgwTY9X2IXuB5-eNyZNWmM3KgAjAATAAzAALAArAAbAA7AAHAAnA6nQpe6vH4w8TyvKTDWSB0QA

Discussion