デザインパターン・Proxy(プロキシ)パターンの実装

デザインパターン・Proxy(プロキシ)パターンの実装をご紹介します。
Proxyパターンを使用することで、ソースコードの変更工数の低減に貢献できます。


Proxyパターンとは

使用するライブラリの仕様を包括して処理を行うデザインパターンです。Proxyパターンのことをラッパーやラッピングとも呼ばれています。

用途・どんな時に使えるの?

主に以下の目的で使用します。

  • ライブラリの仕様を隠蔽し、影響範囲を抑える

例えばあるライブラリを色んなクラスで使用した場合、ライブラリのIF仕様の変更が発生した際はライブラリを使用している箇所全てに影響され、ソースコードの変更規模が大きくなります。

IF仕様の変更は仕方ないことなのですが、変更になった際はできるだけ影響範囲を抑えたいものです。

そこで、ライブラリの仕様を吸収するクラスを作り、IF仕様変更になった際はそのクラスだけが影響を受けるように設計します。

これがProxyパターンの考え方です。

クラス図


Proxy プロキシ デザインパターン


Proxyパターンのクラス設計図です。

My componentの範囲内にあるproxyクラス群はOther componentの範囲内にあるライブラリクラス仕様を吸収し、ライブラリクラスを使用するためのビジネスロジックを実装します。上記の図ではOther componentとして「network」「entity」「os」のライブラリがあり、それぞれにproxyクラスを用意した設計になります。

※上記の設計ですが少し冗長ですね…ここまでProxyクラスを分けなくても良いです。ソフトウェアの規模に合わせてクラス設計してください。
※ExProxyはただのmain関数であり、使用者です。

実装の解説

C++で実装したサンプルコードを解説します。
このサンプルコードはライブラリである「other_network」「other_entity」「other_os」のクラスをproxyクラス経由で使用します。

■ other_network.cpp

■ other_network.h

■ other_entity.cpp

■ other_entity.h

■ other_os.cpp

■ other_os.h

「proxy_network」「proxy_entity」「proxy_os」クラスがそれぞれのotherクラスを吸収するために、otherクラスのヘッダーをcppファイル内でインクルードします。こうすることでotherクラスの仕様をproxy_XXXクラス内に隠蔽することができます。

proxy_XXXクラス内にはotherクラスを使用するためのビジネスロジックを実装します。

使用者側へproxy_XXXクラスのIFを提供するためにはInterfaceクラスであるproxy_requestクラスを継承します。

■ proxy_network.cpp

■ proxy_network.h

■ proxy_entity.cpp

■ proxy_entity.h

■ proxy_os.cpp

■ proxy_os.h

■ proxy_request.cpp

■ proxy_request.h

なお今回の例は使用者側の窓口としてシングルトンクラスを設けています。シングルトンクラスを設けることでproxy_requestクラスとは別にInterfaceクラスが必要になっても、シングルトンクラスがInterfaceクラスを継承するだけで良いので、使用者側へ影響を与えないようにしています。

1つのクラスを窓口として使用するデザインパターンをFacadeパターンと言います。

■ proxy.cpp

■ proxy.h

使い方は以下の通りです。
other_XXXクラスの仕様を隠蔽したproxy_XXXクラスのインスタンスを生成して、シングルトンクラスにセットすることで操作できます。

■ ExProxy.cpp

サンプルコード

Visual C++ 2017で作成したサンプルコードをGitHubで公開しています。
GitHub – ExProxy

実行結果は以下の通りです。
proxy経由でotherクラスを使用していることが確認できます。

[ 16][      main] Start.
[ 29][      main] other network get_token.
[ 13][ send_data] other network send_data.
[  9][write_data] other entity write_data.
[ 41][      main] other entity read_data.
[ 45][      main] other os get_rtc.
[ 47][      main] Terminate.

参考

以下のサイトを参考にさせていただきました。
TECHSCORE(テックスコア) – 21.Proxyパターン

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*

Translate »