目录

一、职责链模式

二、实现

三、优缺点

四、适用环境

五、小结


一、职责链模式

职责链模式:避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止(行为型)。

职责链角色:

  • 抽象处理者:定义一个处理请求的抽象类,不同的具体处理者处理请求的方式不同,因此在它里面定义抽象处理方法;
  • 具体处理者:抽象处理者的子类,实现处理不同的请求。

二、实现

在src目录下,新建一个responsibility文件夹,在该文件夹下新建一个responsibility.cj文件和responsibility.drawio文件。

类图

核心代码

package DesignPattern.responsibility

// 业务类
public class Product {
    public Product(public let id: String, public let name: String, public let price: Int64) {}
}

// 抽象处理者
public abstract class Approver {
    protected var _optApprover = Option<Approver>.None

    protected let name: String
    
    public init (name: String) {
        this.name = name
    }

    public func process(product: Product):Unit

    public func setApprover(approver: Approver){
        this._optApprover = approver
    }
}

// 具体处理者
public class Boss <: Approver {
    public Boss(name: String) {super(name)}

    public func process(product: Product):Unit {
        // 大于10万,老板来审核
        if (product.price > 100000) {
            println("老板: ${this.name} 审批商品单: ${product.id}, 金额: ${product.price}, 采购项目: ${product.name}")
        } else {
            match (this._optApprover) {
                case Some(approver) => approver.process(product)
                case None => println("无审核者")
            }
        }
    }
}

// 具体处理者
public class Leader <: Approver {
    public Leader(name: String) {super(name)}

    public func process(product: Product):Unit {
        // 小于10万,主管来审核
        if (product.price >= 0 &&  product.price <= 100000) {
            println("主管: ${this.name} 审批商品单: ${product.id}, 金额: ${product.price}, 采购项目: ${product.name}")
        }
    }
}

测试代码

package DesignPattern
import DesignPattern.responsibility.*

main(): Int64 {
    let boss = Boss("蟹老板")
    // 设置职责链
    boss.setApprover(Leader("海绵宝宝"))

    let product1 = Product("1001", "肉饼", 200000)
    let product2 = Product("1002", "腌椰菜", 20000)

    boss.process(product1)
    boss.process(product2)


    return 0
}

三、优缺点

优点:

  • 职责链模式使得一个对象无需知道是哪一个对象在处理请求,对象只需要知道该请求会被处理即可;
  • 请求处理对象仅需要维持一个指向其后者的引用,而不需要维持它对候选处理者的引用,简化对象的连接;
  • 新增新的具体请求处理者无需修改源代码,符合开闭原则。

缺点:

  • 由于一个请求没有明确接收者,不能保证该请求一定被执行;
  • 较长的职责链会影响系统性能;
  • 如果设计不得当,会导致循环调用,导致系统陷入死循环。

四、适用环境

  • 很多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时在确定;
  • 不明确指定接收者的情况下向多个对象中的每一个都提交。

五、小结

本章为大家详细的介绍了仓颉设计模式中职责链模式的内容,下一章,为大家带来职责链模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐