1

次の要件があります。

序章

システムはレポート/コンテンツ管理システムです。これにより、ユーザーはレポートに対してCRUD操作を実行できます。

ビジネスロジック/UIコンポーネント

ユーザーがレポートを編集しているとき、他のユーザーはレポートを編集できず、表示のみが可能です。

ロックされたレポートの表示を監視するテーブルのあるページが含まれています。

チャレンジャー

1)この「ロック」メカニズムをどのように実装する必要がありますか?2)私を支援するデザインパターンとAPIは何ですか?

私の現在の実装

レポートサービスクラスがあります。これには、ロックされているすべてのレポートのハッシュマップが含まれます(ロック管理用のユーザーの情報が含まれます)。

SCJDを完了し、ロックメカニズムの使用を検討していましたが、「ロック」を待つ必要がないことに気付きました。

私が心配した唯一の問題は、レポートを「ロック」する(マップにロックを追加する)ときの同時実行性の問題です。これは、同期を使用することで簡単に解決できると思います。

ロックされたレポートテーブルを監視するために、レポートサービスクラスにオブザーバーパターンを実装する予定です。ユーザー/バッキングビーンごとに、レポートサービスに「サブスクライブ」します。

入力はありますか?????

4

1 に答える 1

3

答えは簡単です...この問題は2つのクラスで管理できます。

各クラスの特徴は以下のとおりです。

ReportUtil:
(1)書き込みモードで開いているレポートがあるかどうかを追跡します
(2)使用可能なアクセスモードに基づいてレポートのオブジェクトを作成します

レポート:
(1)与えられたアクセスに基づいて読み取り専用または書き込み可能なレポートを開きます
(2)現在のレポートが書き込みモードで開いていた場合は、閉じている間にReportUtilクラスのフラグをリセットします。

クライアント:
ReportUtilクラスとReportクラスをテストします。


import java.util.LinkedList;

public class ReportUtil {

    private static boolean bIsWriteLockAvaialable = true;

    public static synchronized Report getReport() {
        Report reportObj = new Report(bIsWriteLockAvaialable);
        if(true == bIsWriteLockAvaialable) {
            bIsWriteLockAvaialable = false;
        }
        return reportObj;
    }   

    public static void resetLock() {
        bIsWriteLockAvaialable = true;
    }
}

public class Report {
    private boolean bICanWrite = false;

    public Report(boolean WriteAccess) {
        bICanWrite = WriteAccess;
    }

    public void open() {
        if(bICanWrite == true) {
            //Open in write mode
            System.out.println("Report open in Write mode");
        }
        else {
            //Open in readonly mode
            System.out.println("Report open in Read only mode");
        }
    }

    public synchronized void close() {
        if(bICanWrite == true) {
            ReportUtil.resetLock();
        }
    }
}

public class Client {

    public static void main(String[] args) {
        Report report1 = ReportUtil.getReport();
        report1.open(); //First time open in writable mode

        Report report2 = ReportUtil.getReport();
        report2.open(); //Opens in readonly mode

        Report report3 = ReportUtil.getReport();
        report3.open(); //Opens in readonly mode

        report1.close(); //close the write mode

        Report report4 = ReportUtil.getReport();
        report4.open(); //Opens in writable mode since the first writeable report was closed
    }

}

出力:書き込みモードで開いているレポート読み取り専用モードで開いているレポート読み取り専用モードで開いているレポート書き込みモードで開いているレポート


ここでハッシュテーブルを使用する理由がわかりません。私はあなたの要件を理解していなかったのかもしれません。また、同期の問題を回避するために同期メソッドを使用しました。

レポートを使用しているすべてのユーザーを追跡する必要がある場合は、お知らせください。

ハッピーラーニング!!!

于 2012-11-18T09:25:05.057 に答える