【问题标题】:Java Design: Locking and Monitor reportsJava 设计:锁定和监控报告
【发布时间】:2012-10-28 05:36:53
【问题描述】:

我有以下要求。

简介

该系统是报告/内容管理系统。它允许用户对报表进行 CRUD 操作。

业务逻辑/UI 组件

当用户编辑报告时,其他用户不能编辑报告,只能查看。

它包含一个带有表格的页面,用于监控锁定的报告以供查看。

挑战者

1) 我应该如何实现这种“锁定”机制? 2) 对我有帮助的设计模式和 API 是什么?

我目前的实现

我会有一个报告服务类 它将包含所有被锁定报告的哈希图(带有用于锁定管理的用户信息)

我已完成 SCJD 并正在考虑使用我的锁定机制,但我意识到我不需要等待“锁定”。

我担心的唯一问题是“锁定”报告时的并发问题(将锁定添加到地图中),我相信使用同步可以轻松解决。

对于锁定报表表的监控,我打算在报表服务类中实现观察者模式。对于每个用户/支持bean,它将“订阅”报告服务。

任何输入? ????

【问题讨论】:

    标签: java jsf design-patterns icefaces


    【解决方案1】:

    答案很简单……我们可以用 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
        }
    
    }
    

    输出: 以写入模式打开报告 以只读模式打开报告 以只读模式打开报告 以写入模式打开报告


    我不知道为什么我们要在这里使用哈希表。可能是我没有理解你的要求。另外,我使用了同步方法来避免同步问题。

    如果您的要求是跟踪所有使用该报告的用户,请告诉我。

    学习愉快!!!

    【讨论】:

    • 感谢您的冗长回复。 +1“它包含一个带有监视锁定报告以供查看的表格的页面”-哈希图或表格是跟踪所有被锁定的报告并以列表形式显示它(JSF数据表)是的解决方案很简单,但我'正在寻找一些设计模式来支持这种实现,以便开发人员可以轻松理解它..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2019-04-27
    • 2016-02-21
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多