责任链是指行为设计模式。
电影公司 Jah-Pictures 制作了一部关于利比里亚共产主义拉斯塔法里教徒的纪录片,名为《马利的红色黎明》。这部电影很长(8小时),很有趣,但在上映之前,事实证明,在一些国家,电影中的镜头和短语可能被认为是异端邪说,不会获得发行许可。电影制片人决定手动和自动地从电影中删除包含可疑短语的时刻。需要进行双重检查,以免在人工检查和安装过程中出现错误时,经销商代表不会在某些国家被简单枪决。
国家分为四组:没有审查制度的国家,有中等、中等和非常严格的审查制度。决定使用神经网络对观看的电影片段中的异端级别进行分类。对于该项目,需要购买非常昂贵的最先进的神经元,并针对不同级别的审查进行训练,这是开发人员的任务 -将影片分成碎片,并通过一系列神经网络传输它们,从自由到严格,直到其中一个检测到异端,然后将片段转移到人工审查以进一步编辑。不可能通过所有神经元,因为他们的工作需要太多的计算能力(毕竟我们还要支付电费),在第一个工作时停止就足够了。
朴素的伪代码实现:
import StateOfArtCensorshipHLNNClassifiers
protocol MovieCensorshipClassifier {
    func shouldBeCensored(movieChunk: MovieChunk) -> Bool
}
class CensorshipClassifier: MovieCensorshipClassifier {
    let hnnclassifier: StateOfArtCensorshipHLNNClassifier
    init(_ hnnclassifier: StateOfArtCensorshipHLNNClassifier) {
        self.hnnclassifier = hnnclassifier
    }
    
    func shouldBeCensored(_ movieChunk: MovieChunk) -> Bool {
        return hnnclassifier.shouldBeCensored(movieChunk)
    }
}
let lightCensorshipClassifier = CensorshipClassifier(StateOfArtCensorshipHLNNClassifier("light"))
let normalCensorshipClassifier = CensorshipClassifier(StateOfArtCensorshipHLNNClassifier("normal"))
let hardCensorshipClassifier = CensorshipClassifier(StateOfArtCensorshipHLNNClassifier("hard"))
let classifiers = [lightCensorshipClassifier, normalCensorshipClassifier, hardCensorshipClassifier]
let movie = Movie("Red Jah rising")
for chunk in movie.chunks {
    for classifier in classifiers {
        if classifier.shouldBeCensored(chunk) == true {
            print("Should censor movie chunk: \(chunk), reported by \(classifier)")
        }
   }
}
一般来说,使用分类器数组的解决方案并没有那么糟糕,但是!让我们想象一下,我们无法创建一个数组,我们有机会只创建一个分类器实体,它已经确定了电影片段的审查类型。在开发扩展应用程序功能的库(插件)时,此类限制是可能的。
让我们使用装饰器模式–让我们将链中下一个分类器的引用添加到分类器类中,并在第一个成功分类时停止验证过程。
因此,我们实现了责任链模式:
import StateOfArtCensorshipHLNNClassifiers
protocol MovieCensorshipClassifier {
    func shouldBeCensored(movieChunk: MovieChunk) -> Bool
}
class CensorshipClassifier: MovieCensorshipClassifier {
    let nextClassifier: CensorshipClassifier?
    let hnnclassifier: StateOfArtCensorshipHLNNClassifier
    init(_ hnnclassifier: StateOfArtCensorshipHLNNClassifier, nextClassifier: CensorshipClassifiers?) {
            self.nextClassifier = nextClassifier
            self.hnnclassifier = hnnclassifier
    }
    
    func shouldBeCensored(_ movieChunk: MovieChunk) -> Bool {
        let result = hnnclassifier.shouldBeCensored(movieChunk)
        
        print("Should censor movie chunk: \(movieChunk), reported by \(self)")
        
        if result == true {
                return true
        }
        else {
                return nextClassifier?.shouldBeCensored(movieChunk) ?? false
        }
    }
}
let censorshipClassifier = CensorshipClassifier(StateOfArtCensorshipHLNNClassifier("light"), nextClassifier: CensorshipClassifier(StateOfArtCensorshipHLNNClassifier("normal", nextClassifier: CensorshipClassifier(StateOfArtCensorshipHLNNClassifier("hard")))))
let movie = Movie("Red Jah rising")
for chunk in movie.chunks {
    censorshipClassifier.shouldBeCensored(chunk)
}
参考文献
https://refactoring.guru/ru/设计模式/责任链
源代码
https://gitlab.com/demensdeum/patterns/< /p>
