設計パターンを理解して使用すると、オブジェクト指向の優れたプログラミング習慣を育むことができ、実際のアプリケーションでは、安心する楽しみを楽しむことができます。
プロキシは比較的有用なモデルであり、多くのバリエーションがあります。説明:出発点から、目的地の間に中間層があり、意味のあるエージェントがあります。
設計パターンで定義されている:他のオブジェクトがこのオブジェクトへのアクセスを制御するためのプロキシを提供します。
プロキシモードを使用する理由
1.承認メカニズムは、さまざまなレベルの認証権を持っています。たとえば、Jive Forum Systemでは、承認メカニズムのコントロールにはプロキシが使用されています。 (未登録のユーザー)、およびJiveでは、forumproxyのようなプロキシを介して、これら2人のユーザーのアクセス権をフォーラムに制御できます。
2。クライアントはオブジェクトに直接動作することはできませんが、そのオブジェクトと対話する必要があります。
2つの具体的な例を示します。
1.オブジェクトが大きな画像であり、それを表示するのに長い時間がかかる場合、画像がドキュメントに含まれている場合、エディターまたはブラウザを使用してドキュメントを開き、ドキュメントを非常に迅速に開く必要があり、待つことはできません。
2。そのオブジェクトがインターネット上のリモートサーバー上にあり、ネットワーク速度のためにこのオブジェクトを直接操作する場合、プロキシを使用して最初にそのオブジェクトを置き換えることができます。
要するに、原則は、オーバーヘッドが高いオブジェクトの場合、この原則が多くの貴重なJavaメモリを救うことができるということです。したがって、一部の人々は、Javaがリソースメモリを消費していると考えており、これはプログラミングのアイデアと関係があると思います。
プロキシモードの使用方法
Jiveフォーラムシステムを採用して、フォーラムシステムにアクセスするユーザーには、登録普通のユーザー、フォーラムマネージャー、システムマネージャー、観光客など、多くの種類のユーザーがいます。通常のユーザーを登録することでのみ、フォーラムマネージャーは認定フォーラムを管理でき、システムマネージャーはすべてのトランザクションなどを管理できます。
フォーラムは、フォーラムの操作に関連する主な動作、フォーラムの名前、習得、ポストの削除、編集など、フォーラムに展示されています。
さまざまなレベルの権限を持つユーザーは、forumpermissionsで定義されます。
コードコピーは次のとおりです。
パブリッククラスのforumpermissionsはキャッシュ可能な{
/**
*オブジェクトを読む許可。
*/
public static final int read = 0;
/**
*システム全体を管理者に許可します。
*/
public static final int system_admin = 1;
/**
*特定のフォーラムの管理者への許可。
*/
public static final int forum_admin = 2;
/**
*管理者への特定のユーザーの許可。
*/
public static final int user_admin = 3;
/**
*管理者への特定のグループの許可。
*/
public static final int group_admin = 4;
/**
*近代的なスレッドへの許可。
*/
public static final int moderate_threads = 5;
/**
*新しいスレッドを作成する許可。
*/
public static final int create_thread = 6;
/**
*新しいメッセージを作成する許可。
*/
public static final int create_message = 7;
/**
*現代のメッセージへの許可。
*/
public static final int moderate_messages = 8;
.....
Public Boolean IssystemOrforumadmin(){
return(values [forum_admin] || values [system_admin]);
}
.....
}
したがって、フォーラムのさまざまな操作許可は、forumpermissionsによって定義されたユーザーレベルに関連しています。たとえば、フォーラムの名前を変更する場合、フォーラムマネージャーまたはシステムマネージャーのみがそれを変更できますが、コードは次のとおりです。
コードコピーは次のとおりです。
パブリッククラスforumproxyはフォーラムを実装しています{
プライベートforumpermissions許可。
プライベートフォーラムフォーラム。
this.authorization = authorization;
public forumproxy(フォーラムフォーラム、承認承認、
forumpermissions permissions){
this.forum = forum;
this.authorization = authorization;
this.permissions = permissions;
}
.....
public void setName(string name)throws unauthorizedexception、
ForumalReadyExistSexception {
//システムまたはフォーラム管理者のみが名前を変更できますif(permissions.issystemorumadmin()){
forum.setname(name);
}
それ以外 {
新しいUnouthorizedException();
}
}
...
}
DBForumは、インターフェイスフォーラムの実際の実装です。
コードコピーは次のとおりです。
パブリッククラスDBForumはフォーラム、キャッシュ可能な{
...
public void setName(string name)throws forumal readyexistsection {
...
this.name = name;
//ここで、新しい名前をsavetodb()にデータベースに本当に保存します。
...
}
...
}
フォーラム名を変更するイベントは、最初にforumproxyに対処する必要があります。
毎日のアプリケーションでは、プロキシを使用するかどうかにかかわらず、システム認証またはセキュリティシステムが常に関与することは避けられません。
Jiveと組み合わせて、さらに深く話し続けましょう。工場モデルは以下に関係します。
フォーラムを使用するには、forumproxyの使用が必要であることを知っています。 Singletonはここで使用されています(デザインパターンの1つ)、getInstance()はForumFactoryProxyを返します。
ForumFactoryを返してみませんか?その理由は明らかであり、フォーラムがプロキシを通じてそれを作成する許可を持っているかどうかを判断する必要があります。
ForumFactoryProxyでは、次のようにコードが表示されます。
コードコピーは次のとおりです。
Public Class ForumFactoryProxyはForumFactoryを拡張します{
保護されたForumFactory Factory;
保護された承認承認。
保護されたforumpermissions許可。
public forumfactoryproxy(承認承認、ForumFactory Factory、Forumpermissions Permissions){
this.Factory = Factory;
this.authorization = authorization;
this.permissions = permissions;
}
パブリックフォーラムcreateforum(文字列名、文字列の説明)
UnauthorizedException、forumalReadyExistSexceptionをスローする{
//システム管理者のみがフォーラムを作成できます
if(permissions.get(forumpermissions.system_admin)){
Forum newforum = factory.createforum(name、description);
new forumproxy(newforum、承認、許可)を返します。
}
それ以外 {
新しいUnouthorizedException();
}
}
}
Method Createforumはforumproxyのようなものであり、他のプログラムはプロキシとのみ相互作用できます。
ここには2つのプロキシがあることに注意してください:forumproxyとforumfactoryproxy。 2つの異なる責任を表します。フォーラムの使用とフォーラムの作成です。オブジェクトを使用することがオブジェクトの作成から分離されている理由については、これが工場パターンが使用される理由です。それは「カプセル化」と「ディスパッチ」のためです。言い換えれば、機能はメンテナンスと変更を促進するために可能な限り単一です。
Jive Forum Systemでのその他のポスト作成と使用は、フォーラムのアイデアに基づいています。
上記では、承認メカニズムへのアクセスのためにプロキシを使用する方法についても説明しました。巨大で複雑なオブジェクトをコピーすることは、コピープロセス中に元のオブジェクトに変更がない場合、そのようなコピーオーバーヘッドは不要です。プロキシを使用して、このコピープロセスを遅らせます。
たとえば、Hashtableなどの大規模なコレクションがあり、多くのクライアントが同時に同時にアクセスします。特別なクライアントの1つは継続的なデータ収集を実行する必要があり、現時点では、他のクライアントは、ハッシュテーブルに物を追加または削除しなくする必要があります。
最も直接的な解決策は、コレクションロックを使用し、この特別なクライアントにこのロックを取得し、継続的なデータ収集を実行してからロックを解放させます。
コードコピーは次のとおりです。
public void fofetches(ハッシュテーブルHT){
同期(HT){
//特定の継続的なデータ収集アクション...
}
}
ただし、この方法ではコレクションを長時間ロックする可能性があり、他のクライアントはこの期間中にコレクションにアクセスできません。
2番目のソリューションは、コレクションを閉じてから、連続データにクローンのコレクション操作を取得できるようにすることです。このソリューションは、コレクションがクローン可能であり、深いクローンを提供する方法がなければならないという事実を前提としています。 Hashtableは独自のクローンメソッドを提供しますが、キーと値のオブジェクトのクローンではありません。
コードコピーは次のとおりです。
public void fofetches(ハッシュテーブルHT){
hashttable newht =(hashtable)ht.clone();
}
問題は、クローンに基づいたオブジェクト操作であるため、元の親が他のクライアント操作によって変更された場合、クローンオブジェクトの操作は無意味になります。
最終的な解決策:クローン化する前に他のクライアントが修正を完了するまで待つことができます。つまり、この特別なクライアントは、最初にCloneと呼ばれるメソッドを呼び出すことにより、一連のデータ収集操作を実行します。しかし、実際、他のクライアントがオブジェクトコレクションを変更するまで、実際にはオブジェクトのコピーは行われませんでした。
このソリューションを実装して、プロキシを使用してコピーオンワイト操作です。
プロキシには、RMIやCorbaなどの一般的な分布計算方法がすべてプロキシモードのアプリケーションです。