IT铁人DAY 24-Chain of Responsibility 责任链模式

  今天要认识的模式是Chain of Responsibility,属於Behavioral Design Pattern,它的名字很长,我觉得很好认,而且也不难,现在就一起来认识它吧!


问题情境与解析

  原本你的应用程序从客户端发送请求後,会需要经过一些资料处理的步骤,才能存入系统的资料库中,而这些资料处理的步骤可能会因为系统不断的更新,而导致步骤的顺序变更,抑或是添加新的检验步骤来增加系统的安全性,因此这个检验的程序就会变得非常难以维护且又不好理解,你必须得重构这整件事情。

  使用责任链模式的话,会将每个检查的步骤封装成一个独立的类别,其他的请求及数据就用参数的方式来传递给类别中的方法。而这些检查步骤会串成一个链结,而且拥有下一个检查步骤物件的属性,因此客户端的请求会沿着链结一直传递下去,每个节点都有机会去处理这个请求。

  Chain of Responsibility在这个例子中,可以随时添加新的检查步骤,也可以移除或修改步骤的方法,甚至是重新调整检查步骤的顺序,端看应用程序的逻辑做动态更新,是不是非常方便呢!

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20211009/20140743KLBEKxh86y.png

Skeleton Code

abstract class Handler {
    private Handler next;
    
    public Handler(Handler next) {
        this.next = next;
    }
    
    public void handleRequest() {
        if (next != null) {
            next.handleRequest();
        }
    }
}

class HandlerA extends Handler {
    
    public HandlerA(Handler next) {
        super(next);
    }
    
    public void handleRequest() {
        if (canHandleRquest()) {
            // do something
        } else {
            super.handleRequest();
        }
    }
}

class HandlerB extends Handler {
    
    public HandlerB(Handler next) {
        super(next);
    }
    
    public void handleRequest() {
        if (canHandleRquest()) {
            // do something
        } else {
            super.handleRequest();
        }
    }
}

  责任链模式可以实现较松散的耦合设计,来自客户端的请求会被传递到链结中的物件,接着由这些物件去判定该给谁去处理,以及是否需要给下一个物件来处理请求。若要动态修改链结中的物件或是调整其顺序也是可以接受的,提升了程序整体的灵活性,不过链结中的物件也有可能都没办法处理来自客户端的请求,这也是此模式的缺点之一。


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  Day25:今天来聊一下Azure Sentinel中的威胁情报

>>:  30天打造品牌特色电商网站 Day.24 电商必用的各类提示

Epoch(时期)、Batch size(批次)、Iteration(迭代)、Learning rate

  在研究类神经网路的程序时,发现会用到一些这概念,因此就来研究了一下。   这四样东西,在机器学习...

15 | WordPress 社交网路服务图示 Social Icons Block

「社交网路服务图示区块」可让你将社交媒体图示新增到任何页面或文章,将访客导向到你的社交媒体个人档案...

Day 17 : Add Two Numbers

这一题题目会给我们两个Linked Lists,分别代表两个非负整数。题目要我们把两个数相加後回传一...

愿财力与你同在

不知不觉已经来到最後一天了, 写这系列是临时决定的,每天的库存量都是0,所以有很多文章,我都只挑重点...

IOS、Python自学心得30天 Day-27 IOS导入Firebase套件

https://github.com/firebase/firebase-ios-sdk 然後选择...