Rubyのデザインパターン開発におけるProxyパターンの利用について
プロキシパターン
Proxyパターンは、アクセスするオブジェクトがリモートマシンにある場合など、オブジェクトに直接アクセスする際に発生する問題に対処するための構造設計パターンである。オブジェクト指向システムでは、何らかの理由で(オブジェクトの作成のオーバーヘッド、またはいくつかの操作は、セキュリティ制御を必要とする、またはプロセス外のアクセスを必要とする)、直接アクセスすると、ユーザやシステム構造に多くのトラブルをもたらすいくつかのオブジェクトは、我々はこのオブジェクトにアクセスするときに、アクセス層を追加することができます。次の図です。
例えば、CとAが同じサーバー上になく、Aが頻繁にCを呼び出す必要がある場合、A上にProxyクラスを作り、CへのアクセスをProxyに与えることで、AにとってはCのオブジェクトに直接アクセスするのと同じことになります。Aの開発では、ビジネスの実装に全面的に集中することができます。
GoFデザインパターンにはこうあります。このオブジェクトへのアクセスを制御するために、他のオブジェクトのためのプロキシを提供する。
Proxyパターンの構造。
プロキシパターンを介して、クライアントから見えない形でターゲットオブジェクトの動作を動的に制御する。
インスタンス
class BankAccount
def deposit
p "store the money"
end
end
class Proxy
attr_accessor :bankAccount
def initialize bankAccount
@bankAccount = bankAccount
end
def deposit
@bankAccount.deposit
end
end
銀行口座クラスを作成し、次に銀行口座クラスを集約し、同じ動作構造を提供するプロキシクラスを作成します。顧客にとってプロキシクラスは擬似口座クラスであり、プロキシクラスに対して操作を行うと、実際には本物の銀行クラスに対して操作を行っていることになります。
動作制御を追加する。
class Proxy
attr_accessor :bankAccount
def initialize bankAccount
@bankAccount = bankAccount
end
def deposit
check_something
@bankAccount.deposit
end
def check_something
#do some checking code
end
end
これにより、ターゲットオブジェクトの呼び出しに制御コードを追加することができますが、通常のBankAccountオブジェクトのメソッドを呼び出すのと同じように、クライアントにはすべて透過的に表示されます。
bankAccount = BankAccount.new
bankAccount.deposit
proxy = Proxy.new bankAccount
proxy.deposit
Proxyパターンのキーポイント。
1.quot;インダイレクトの層を追加する"は、ソフトウェアシステムにおける多くの責任ある問題に対する一般的な解決策である。オブジェクト指向システムでは、特定のオブジェクトを直接使用すると多くの問題が発生することがあり、間接層としてのプロキシオブジェクトはこの問題を解決するための一般的な手段である。
それから、例えば、少し前にAOPとRemotingを調べたとき、アプリケーションドメインをまたいだアクセスのために、TransparentProxyをクライアントアプリケーションに提供し、クライアントアプリケーションはこのproxyにアクセスすることで実際の型オブジェクトに実際にアクセスするのです。
2. 具体的なプロキシデザインパターンの実装方法や粒度は様々で、個々のオブジェクトを細かく制御するものもあれば、コンポーネントモジュールがアーキテクチャレベルでオブジェクトのプロキシを作るための抽象的なプロキシレイヤーを提供する場合もある。
例えば、上記の例では、プロキシ型ProxyClassとプロキシ型LongDistanceClassは同じインターフェースを継承する必要はない。GoFデザインパターンのように、他のオブジェクトにプロキシを提供し、そのオブジェクトへのアクセスを制御するのである。プロキシ型は、ある意味でプロキシされた型へのアクセスを制御する役割を果たすこともできる。
関連
-
挿入ソートアルゴリズムのRuby実装と高度な双方向挿入ソートコード例
-
Rubyのシングルトンメソッドとシングルトンクラス
-
Ruby on Railsで構築するアプリケーションの基本的なディレクトリ構造のまとめ
-
Rubyプログラムにおける正規表現の基本的な使い方に関するチュートリアル
-
RubyアプリケーションでHTTPベースのリクエストを送信する簡単な例
-
Rubyのデザインパターン。アダプタパターン実践ガイド
-
RubyのSimple FactoryパターンとFactory Methodパターンを利用する
-
Rubyのデバッグツールruby-debug-base19のインストールと設定(Windows版
-
Ruby on RailsのActiveResourceの使い方解説
-
Rubyプログラミングにおけるネーミングスタイルガイド
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン