文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.4 职责链模式
在职责链模式下,有意将使用并实现一个接口(一个或更多的方法)的数个对象松散耦合。一组实现接口的对象按照列表的形式进行组合(或者在极少数情况下按照树的形式)。使用接口的对象向第一个 实现器 (implementor)对象发出请求。第一个实现器对象会确定是否自己执行任何行为,以及是否将该请求沿列表(或树)传播下去。有时,当实现器对象都没有响应请求时,会在模式中编写对一些请求的默认实现。
1.4.1 范例
在该例中,脚本向 lister
对象发送请求, lister
指向 UnixLister
对象。如果它无法处理该请求,则将该请求发送给 WindowsLister
。如果还不能处理该请求,则继续发送给 DefaultLister
。
class UnixLister {
private nextInLine
UnixLister(next) { nextInLine = next }
def listFiles(dir) {
if (System.getProperty('os.name') == 'Linux') {
println "ls $dir".execute().text
} else {
nextInLine.listFiles(dir)
}
}
}
class WindowsLister {
private nextInLine
WindowsLister(next) { nextInLine = next }
def listFiles(dir) {
if (System.getProperty('os.name') == 'Windows XP') {
println "cmd.exe /c dir $dir".execute().text
} else {
nextInLine.listFiles(dir)
}
}
}
class DefaultLister {
def listFiles(dir) {
new File(dir).eachFile { f -> println f }
}
}
def lister = new UnixLister(new WindowsLister(new DefaultLister()))
lister.listFiles('Downloads')
输出一个文件列表(根据操作系统的差别,输出格式将稍有不同)。
下面是 UML 的表示形式:
该模式的变体形式有:
- 可以利用显式接口(比如
Lister
)将实现进行静态类型转换,但由于 duck-typing 特性的存在,这是一种选择方法。 - 可以使用链树而非列表
if (animal.hasBackbone())
委托给VertebrateHandler
,否则就委托给InvertebrateHandler
。 - 可以一直沿链传递,即使在处理请求时。
- 可以在一定的时间不响应不再沿链进行传递。
- 使用 Groovy 的元编程特性沿链传递未知方法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论