プロキシモード
プロキシモード(Proxyパターン)、別のクラスの代わりに関数のクラスで。 デザインパターンのこのタイプは、構造モデルに属しています。
プロキシモードでは、我々は外の世界への機能インターフェースを提供するために、既存のオブジェクトを持つオブジェクトを作成します。
入門
意図:他のオブジェクトにこのオブジェクトへのアクセスを制御するための薬剤を提供します。
主な解決方法:リモートマシン上でアクセスするオブジェクト:オブジェクトへの直接アクセスは、次のような問題を引き起こしました。オブジェクト指向システムでは、何らかの理由で一部のオブジェクトは、(のようなオブジェクトの作成が高価である、または特定のアクションがセキュリティコントロール、またはプロセスの外部アクセスを必要とする)、それはユーザーにシステム構成やトラブルの多くに直接アクセスできるようになります、私たちは、このオブジェクトへのアクセス時に、このオブジェクトにアクセスするための層を追加することができます。
ときに使用する:あなたは、クラスへのアクセスを制御するために何かをしたいとき。
修正方法:中間層を追加します。
キーコード:プロキシクラスの組み合わせとのリンク。
応用例:1、Windowsが内部のショートカット。2、豚を理解することができ、高Cuilan結果モンキーの変更に行ってきました:猿の王を見ていないとき猿王が高いCuilanなるように抽象化し、高いCuilan外観を、高ターコイズブルーIと猿は、このインタフェース、豚のアクセス高いCuilanを実装しますプロキシクラス。 3は、必ずしもあなたもアウトレットに行くことができる、買うために駅で列車の切符を購入します。 4、小切手または預金の銀行の証明書は、プロキシアカウントの資金です。 市場での取引をチェックしてください代わりに現金の使用、および発行体の資本勘定の制御を提供します。 5、スプリングAOP。
利点:1、明確な責任。2、高いスケーラビリティ。 3、インテリジェントな。
短所:1、クライアントと、そのようにプロキシモードのいくつかのタイプは、より遅い処理速度の要求をもたらすことができるプロキシオブジェクトこと実際のテーマの間です。図2に示すように、プロキシモードを実現するためには、いくつかのプロキシモードを達成するために、追加の作業は非常に複雑である必要があります。
使用シナリオは:1、リモートエージェント:責任を分割するためによると、通常、次の使用シナリオを持っています。2.アラート。 3、コピーオンライトのエージェント。 4、保護(プロテクトまたはAccess)エージェント。 5、キャッシュエージェント。 6、ファイアウォール(ファイアウォール)エージェント。 7、同期(同期)エージェント。 8、インテリジェント参照(スマート参考)エージェント。
注:1とアダプタモードの違いを:アダプタパターンの主要な変更が企図オブジェクトのインタフェース、およびプロキシモードは、クラスのインターフェイスのエージェントによって変更することはできません。2とデコレータパターンの違い:デコレータは、機能性を高めるために、プロキシモードが制御されます。
実現
私たちは、エンティティクラスのイメージインタフェースのイメージインタフェースと実装を作成します。ProxyImageは、メモリフットプリントRealImageロードされたオブジェクトを低減し、プロキシクラスです。
ProxyPatternDemoは、我々は、オンデマンドでロードされ、表示する画像のオブジェクトを取得するProxyImageクラスの使用を示します。
ステップ1
インターフェイスを作成します。
Image.java
パブリックインターフェイスイメージ{ ボイドディスプレイ(); }
ステップ2
インターフェイスを実装するエンティティクラスを作成します。
RealImage.java
パブリッククラスRealImageは{画像を実装します プライベート文字列のファイル名; 公共RealImage(文字列filename){ this.fileName =ファイル名; loadFromDisk(fileNameに); } @Override 公共ボイドディスプレイ(){ System.out.println(+ファイル名を "表示"); } プライベートボイドloadFromDisk(文字列filename){ System.out.println( "読み込み中" + fileNameに); } }
ProxyImage.java
パブリッククラスProxyImageは{画像を実装します プライベートRealImage realImage。 プライベート文字列のファイル名; 公共ProxyImage(文字列filename){ this.fileName =ファイル名; } @Override 公共ボイドディスプレイ(){ {(realImage == null)の場合 realImage =新しいRealImage(fileNameに); } realImage.display()。 } }
ステップ3
要求された場合には、RealImageクラスオブジェクトを取得するためにProxyImageを使用しています。
ProxyPatternDemo.java
パブリッククラスProxyPatternDemo { 公共の静的な無効メイン(文字列[] args){ イメージイメージ=新しいProxyImage(「test_10mb.jpg "); //ディスクimage.display()から画像をロードします。 System.out.println( "")。 //画像が)(ディスクimage.displayからロードすることはできません。 } }
ステップ4
出力を確認します。
ローディングtest_10mb.jpg 表示test_10mb.jpg 表示test_10mb.jpg