[Go言語]Proxyパターンを学ぼう!

こんにちは、KOUKIです。

この記事では、デザインパターンの一つであるProxyパターンについて紹介します。

デザインパターンまとめ

シチュエーション

ProxyパターンのProxyは、「代理人」という意味です。本人が行いたい仕事をこの代理人が代わって実行するイメージを持ってもらえればわかりやすいと思います。

例えば、とある仮想通貨APIへリクエストを送りたいとします。

このコードの呼び出しは、次のようになります。

これは、代理人を使わず、クライアントが直接APIを呼び出しています。

一見問題がないように思えますが、APIへアクセスしているということは、その間にネットワーク通信が走っているということです。

アクセスが少ない内は特に問題はありませんが、これが大量のリクエストとなった場合はどうなるでしょうか?

ご覧の通り、何回もAPIを呼び出すことになり、圧迫感が半端ない状況になりました^^

この様な問題の解決方法として、Proxyパターンが使えます。

Proxyパターンを実装する

前述の通り、Proxyパターンは代理人です。それでは、何を代理すれば良いでしょうか?

決まっていますね。APIの処理を代理すればいいのです。

例えば、APIへの呼び出しの代わりに、キャッシュ(代理人)からデータを返却できるようにしてみましょう。

Proxy インターフェースの実装

Proxyは、本人(API)の代理人として処理を実行するので、本人と同じメソッドを持たせたいです。その為に、Proxyインターフェースを実装します。

Proxy構造体を実装

次に、Proxy構造体を実装します。

キャッシュには、syncパッケージのMapを使っています。

Proxyコンストラクタの定義

続いて、Proxyコンストラクタを定義します。

Proxyメソッドの定義

Proxyメソッドは、インターフェースに定義したgetValueを実装します。

sync.Mapでキャッシュがあるかチェックし、存在する場合はキャッシュからデータを返却し、存在しない場合は、APIへリクエストを転送しています。

まさに、代理人ですね!

使ってみよう

先ほどと同じ方法で、APIを呼び出します。

最初の呼び出し時のみAPIを呼び、それ以降はキャッシュからデータを取得している様子がわかりますね^^

まとめ

Proxyパターンは、Decoratorパターンと少し似てますね。

どこの誰に責任(処理)を持たせるか、そういったことを考えながらプログラミングをするのも結構面白いです^^

それでは、また!

Go言語まとめ

ソースコード

コメントを残す