Holder模式(Holder Pattern):公司员工权限管理系统实战案例分析

image.png

在一个大型公司中,员工根据其职位和部门被赋予不同的权限。这些权限可能包括访问敏感数据、审批财务报告、提交报销等。随着公司规模的增长和组织结构的复杂化,管理员工权限变得越来越重要。

2. 为什么要使用Holder设计模式

Holder模式允许我们将所有员工的权限信息集中存储和管理,确保权限数据的一致性和安全性,同时简化权限的维护和更新。

3. 标准Holder设计模式图

image.png

4. 业务Holder设计模式图

image.png

5. 业务代码参考

    import java.util.Collections;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;

    // 员工权限持有者
    class EmployeePermissionHolder {
        private static EmployeePermissionHolder instance;
        private Map<String, Set<String>> permissionsMap;

        private EmployeePermissionHolder() {
            permissionsMap = new HashMap<>();
            // 模拟从数据库加载权限数据
            loadPermissions();
        }

        public static EmployeePermissionHolder getInstance() {
            if (instance == null) {
                instance = new EmployeePermissionHolder();
            }
            return instance;
        }

        private void loadPermissions() {
            // 模拟加载权限
            permissionsMap.put("Manager_Finance", new HashSet<>(Set.of("create_invoice", "approve_expense")));
            permissionsMap.put("Employee_Marketing", new HashSet<>(Set.of("submit_expense", "view_report")));
            // 可以继续添加更多职位和权限
        }

        public Set<String> getPermissionsByPosition(String positionKey) {
            return permissionsMap.getOrDefault(positionKey, Collections.emptySet());
        }
    }

    // 员工类
    class Employee {
        private String name;
        private String positionKey;

        public Employee(String name, String positionKey) {
            this.name = name;
            this.positionKey = positionKey;
        }

        public String getName() {
            return name;
        }

        public String getPositionKey() {
            return positionKey;
        }

        public Set<String> getPermissions() {
            return EmployeePermissionHolder.getInstance().getPermissionsByPosition(positionKey);
        }
    }

    // 客户端使用示例
    public class CompanyApplication {
        public static void main(String[] args) {
            Employee manager = new Employee("张三", "Manager_Finance");
            Employee marketingEmployee = new Employee("李四", "Employee_Marketing");

            System.out.println("员工 " + manager.getName() + " 的权限包括: " + manager.getPermissions());
            System.out.println("员工 " + marketingEmployee.getName() + " 的权限包括: " + marketingEmployee.getPermissions());
        }
    }

6. 使用Holder设计模式的好处

  • 集中管理:所有员工的权限信息都在EmployeePermissionHolder中集中管理,便于维护和更新。
  • 权限一致性:确保所有员工的权限信息是一致的,避免权限管理上的混乱。
  • 易于扩展:新增职位或部门的权限时,只需在EmployeePermissionHolder中更新。

7. 其他使用Holder设计模式场景参考

  • 多角色权限系统:如网站或应用程序中的用户角色权限管理。
  • 资源分配:如云服务环境中对不同用户或组的资源分配。

8. 可参考开源框架

  • Spring Security:虽然主要用于安全框架,但其权限管理部分可以作为如何实现灵活权限管理的参考。

9. 使用与不使用Holder的区别

以下案例的情况下,如果只是简单地需要一个全局访问点来获取配置信息,使用单例模式可能就足够了。然而,引入Holder模式(或称为Holder Pattern、Holder Singleton Pattern)提供了一些额外的优势,特别是在处理延迟加载(Lazy Loading)和隐藏实现细节方面。

  • 纯单例模式
    public class LoggerConfig {
        private static LoggerConfig instance;
        private String logLevel;

        private LoggerConfig() {
            logLevel = loadLogLevel(); // 立即加载
        }

        public static LoggerConfig getInstance() {
            if (instance == null) {
                instance = new LoggerConfig();
            }
            return instance;
        }

        private String loadLogLevel() {
            // 加载日志级别
            return "INFO";
        }

        public String getLogLevel() {
            return logLevel;
        }
    }
  • 使用Holder模式
    public class LoggerConfigHolder {
        private static class Holder {
            private static final LoggerConfig INSTANCE = new LoggerConfig();
        }

        public static LoggerConfig getInstance() {
            return Holder.INSTANCE;
        }
    }

    private class LoggerConfig {
        private String logLevel;

        private LoggerConfig() {
            // 构造函数私有,外部无法直接创建实例
            logLevel = loadLogLevel();
        }

        private String loadLogLevel() {
            // 加载逻辑可以在这里实现延迟加载
            return "INFO";
        }
    }
  • 使用Holder模式有如下场景
  1. 延迟加载
    • Holder模式:可以实现延迟加载,即只有在真正需要配置时才进行加载。这可以提高应用程序的启动速度,尤其是当配置加载成本较高时(例如,需要从远程服务器加载配置)。
  2. 隐藏实现细节
    • Holder模式:通过引入一个持有者类,可以将配置对象的创建和初始化逻辑隐藏起来。这样,其他部分的代码只需要与持有者交互,而不需要知道具体的配置类是如何实现的。
  3. 分离关注点
    • Holder模式:将配置的获取逻辑和配置对象本身的逻辑分离。这有助于进一步降低系统的耦合度,使得配置对象的变化不会影响到获取配置的逻辑。
  4. 灵活性和扩展性
    • Holder模式:如果未来需要支持多种类型的配置或者需要根据不同条件加载不同的配置,Holder模式可以更容易地进行扩展。

总结

Holder模式在公司员工权限管理系统中的应用,提供了一种集中和一致的方式来管理员工权限,增强了系统的灵活性和可维护性。

历史热点文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容