惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
月光博客
月光博客
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
O
OpenAI News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Know Your Adversary
Know Your Adversary
Last Week in AI
Last Week in AI
S
Securelist
Engineering at Meta
Engineering at Meta
博客园 - 司徒正美
P
Privacy & Cybersecurity Law Blog
T
Tailwind CSS Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Scott Helme
Scott Helme
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
Hacker News: Ask HN
Hacker News: Ask HN
Hugging Face - Blog
Hugging Face - Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
Lohrmann on Cybersecurity
IT之家
IT之家
Security Archives - TechRepublic
Security Archives - TechRepublic
I
InfoQ
S
Security @ Cisco Blogs
Webroot Blog
Webroot Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Full Disclosure
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
人人都是产品经理
人人都是产品经理
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog RSS Feed
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - 外科手术医生

Spring-AI开发之旅 MACD秒解 历史的车轮 添加pdf的目录 spring ai提示词 纳瓦尔宝典-总结内容 小龙虾的skills哪里找? JMeter压测使用 Git仓库ssh不同环境配置 成功没有奇迹,只有积累----Bruce Lee 为什么要⽤ Foundry git命令下,mac环境下载依赖相关报错问题解决方案 数据分析/数据挖掘/机器学习---- 必读书目(转) 简单高效的语言 OSI模型-一图胜千言 dubbo分布式系统 JVM解剖 线程池 集合类 concurrent之CAS concurrent之volatile 架构师之路 Junit框架分析 线程详解 计划自己的时间
责任链设计模式
外科手术医生 · 2021-02-08 · via 博客园 - 外科手术医生

  责任链模式是一种行为设计模式,允许你将请求沿着处理者链进行发送,在收到请求后,每个处理这均可对请求进行处理,或将其传奇给链上的下个处理者

下面就是现实中使用的一个场景,一个公司的员工,需要进行请假,会经过以下几种情况,请假天数小于4天,主管审批,请假天数大于3天小于8天项目经理审批,请假天数大于7天,公司总经理审批

1.有四个角色,职员,主管,项目经理,总经理
2.动作:职员请假,主管,项目经理,总经理审批,这个是已有场景中可以获取到的信息,但是还缺少一个信息,就是请假的信息,这个对象需要怎么构建

  • 首先我们会定义角色对象,GeneralManager,ProjectManager,Supervisor,Employee,再定义对象之间信息传输的过程信息对象ProcessInfo,这个对象中,有审批结果信息,审批天数,审批评论,审批角色(谁审批),对于审批结果我们可以定一个StatusConstants,常量池,方便对象的审批状态获取,应该是各个角色都赋予的功能,动作的发起对象,动作的审批对象,过程的信息模型我们也创建好,那接下来,来写核心处理器,因为我们会对行为和属性进行抽象,所以使用抽象类比接口更为合适,还有抽象类更适合实现流程话的方式

  在抽象类中,我们会创建两个方法,一个是各个角色都要实现各自功能的方法的approve,还有一个是各个角色approve后的,统一处理方法afterApprove,比如通知职员审批结果等操作

  下面是实现代码,代码总共分为三部分,发起,执行动作,执行动作后

private static void callDesign(){
            Employee employee = new Employee();
            Integer wDay = employee.submit();
    
            ProcessInfo processInfo = new ProcessInfo();
            processInfo.setDay(wDay);
    
            Supervisor supervisor = new Supervisor();
            supervisor.approve(processInfo);
        }


 public void approve(ProcessInfo processInfo) {
        processInfo.setResult(StatusConstants.approve_rs_agree);
        processInfo.setRole(role_name);
        super.afterApprove(processInfo);
        //可以加入外部动作...
        super.handler(new ProjectManager(), processInfo);
    }

public abstract void approve(ProcessInfo processInfo);

    public void afterApprove(ProcessInfo p){
        if (StatusConstants.approve_rs_agree.equals(p.getResult())){
            System.out.println(p.getRole() + " " +StatusConstants.approve_rs_agree);
        } else {
            System.out.println(p.getRole() + " " +StatusConstants.approve_rs_reject);
            System.out.println(p.getRole() + " " +p.getComment());
        }
    }
  • 这种情况,如果没有设计模式的实现,会发现代码很大冗余,不好改动,实现比较简单
private static void callNoDesign(){
        Employee employee = new Employee();
        Integer wDay = employee.submit();
        if (wDay < 4) {
            Supervisor supervisor = new Supervisor();
            supervisor.approve();
        } else if (wDay < 8){
            Supervisor supervisor = new Supervisor();
            supervisor.approve();
            ProjectManager projectManager = new ProjectManager();
            projectManager.approve();
        } else {
            Supervisor supervisor = new Supervisor();
            supervisor.approve();
            ProjectManager projectManager = new ProjectManager();
            projectManager.approve();
            GeneralManager generalManager = new GeneralManager();
            generalManager.approve();
        }
    }