エージェントモデルの本質はミドルウェアであり、主な目的はサービスプロバイダーとユーザーを分離することです。ユーザーはプロキシを介して間接的にサービスプロバイダーにアクセスします。これにより、プロキシのカプセル化と制御が容易になります。構造モデルです。
まず、目的
外部の呼び出し元がサービスプロバイダーにアクセスするためのプロキシオブジェクトを提供します。
2.動機
ターゲットオブジェクトへの直接アクセスを制限し、結合を減らします。
3つ、長所と短所
利点:
- 低結合
- 拡張しやすい
- 高い柔軟性
短所:
- 間接アクセスは要求応答を遅らせる可能性があります
- ワークロードを増やす
4、分類
- 静的プロキシ
- 動的プロキシ
プロキシクラス自体の実装は単純ではない場合があります。さらに、プロキシを必要とするすべてのオブジェクトはプロキシクラスを実装する必要があります。ワークロード自体は比較的大きく、エラーが発生しやすくなります。いわゆる動的プロキシ(DynamicProxy)は、プログラムの実行時にターゲットオブジェクトへの動的に生成されたアクセスインターフェイスを指します。この記事では主に前者を紹介しますが、後者については、JDKに付属の動的プロキシを参照できます。
5.主な目的
プロキシモードは、次のシナリオでより適切です。
- リモートエージェント
- 仮想エージェント
- 保護剤
- インテリジェントガイダンスエージェント
- コピーオンライトプロキシ
- キャッシングプロキシ
- ファイアウォールプロキシ
- 同期エージェント
六、原則
以下は、GoFによって導入されたプロキシモデルの典型的なUMLクラス図です 。Subject
:
RealSubjectの外部インターフェイスを定義します。これらのインターフェイスは、外部でプロキシを呼び出すインターフェイスが最終的にrealsubjectへの呼び出しに変換されるようにProxyによって実装する必要があります。
RealSubject:
実際のターゲットオブジェクト。
プロキシ:
ターゲットオブジェクトのプロキシ。ターゲットオブジェクトの制御と管理を担当し、ターゲットオブジェクトへの外部アクセスを間接的に渡します。
- リモートプロキシ:ローカルリクエストとパラメータをシリアル化し、リモートオブジェクトにリクエストを送信し、応答結果を逆シリアル化し、最終結果を呼び出し元にフィードバックします。
- 仮想プロキシ:ターゲットオブジェクトの作成コストが比較的高い場合、ターゲットオブジェクトは遅延または非同期の方法で作成できます。
- 保護プロキシ:ターゲットオブジェクトのアクセス権限の制御を調整します。
セブン、実現
以下では、2つの例を使用して、プロキシモードの適用を実際に体験します。
ネットワークエージェント
中国で直接アクセスできない一部のWebサイトでは、合法的に使用されているネットワークエージェントがターゲットWebサイトへのアクセスを実現できます。
パブリックインターフェイスクラスサーバーを定義します。
public interface Server{
void visit(String url);
}
ProxyServer:
public class ProxyServer implements Server{
private RealServer realServer;
public ProxyServer(String serverName){
this.realServer = new RealServer(serverName);
}
@Override
public void visit(String url) {
realServer.visit(url);
}
}
ターゲットサーバーRealServer:
public class RealServer implements Server {
private String serverName;
public RealServer(String serverName) {
this.serverName = serverName;
System.out.println("This is " + serverName);
}
@Override
public void visit(String url) {
response(url);
}
private void response(String res) {
System.out.println("This is response of " + res + " from server:" + serverName);
}
}
デモ:
public class Demo {
public static void main(String[] args) {
Server server = new ProxyServer("www.google.com");
server.visit("map.google.com");
}
}
スマートポインタ参照カウント
以下では、プロキシモードを使用して、ポインタ参照カウントの問題を単純にシミュレートします。
インターフェイスクラスObj:
public interface Obj{
void GetAttr();
Obj copy();
void delete();
}
スマートポインタクラスSmartPointer:
View Code
参照オブジェクトクラスRealObj:
View Code
何を待っていますか?linuxC / C ++言語交換グループをお勧めします:[ 1106675687 ]グループファイルで共有したほうがよいと思う学習本とビデオ資料をいくつかまとめました。必要に応じて追加できます。トップ100がグループに入り、C / C ++の追加コピー、199に相当するLinux資料(ビデオチュートリアル、電子書籍、実際の戦闘プロジェクトおよびコード)が配布され、次の部分が表示されます。