1700478986
1700478987
整个场景我们已经清晰,想想看,我们把请求者看成是被观察者,它的行为或属性变更通知了观察者——上海DNS,上海DNS又作为被观察者出现了自己不能处理的行为(行为改变),通知了中国顶级DNS,依次类推,这是不是一个非常标准的触发链?而且还必须是同步的触发,异步触发已经在该场景中失去了意义(读者可以想想为什么)。
1700478988
1700478989
分析了这么多,我们用触发链来模拟DNS的解析过程,如图32-10所示。
1700478990
1700478991
1700478992
1700478993
1700478994
图32-10 触发链模式实现DNS解析的类图
1700478995
1700478996
与责任链模式很相似,仅仅多了一个Observable父类和Observer接口,但是在实现上这两种模式有非常大的差异。我们先来解释一下抽象DnsServer的作用。
1700478997
1700478998
❑标示声明
1700478999
1700479000
表示所有的DNS服务器都具备双重身份:既是观察者也是被观察者,这很重要,它声明所有的服务器都具有相同的身份标志,具有该标志后就可以在链中随意移动,而无需固定在链中的某个位置(这也是链的一个重要特性)。
1700479001
1700479002
❑业务抽象
1700479003
1700479004
方法setUpperServer的作用是设置父DNS,也就是设置自己的观察者,update方法不仅仅是一个事件的处理者,也同时是事件的触发者。
1700479005
1700479006
我们来看代码,首先是最简单的,Recorder类与责任链模式中的记录相同,这里不再赘述。那我们就先看看该模式的核心抽象DnsServer,如代码清单32-37所示。
1700479007
1700479008
代码清单32-37 抽象DNS服务器
1700479009
1700479010
public abstract class DnsServer extends Observable implements Observer{
1700479011
1700479012
//处理请求,也就是接收到事件后的处理
1700479013
1700479014
public void update(Observable arg0,Object arg1){
1700479015
1700479016
Recorder recorder=(Recorder)arg1;
1700479017
1700479018
//如果本机能解析
1700479019
1700479020
if(isLocal(recorder)){
1700479021
1700479022
recorder.setIp(genIpAddress());
1700479023
1700479024
}else{//本机不能解析,则提交到上级DNS
1700479025
1700479026
responsFromUpperServer(recorder);
1700479027
1700479028
}
1700479029
1700479030
//签名
1700479031
1700479032
sign(recorder);
1700479033
1700479034
}
1700479035
[
上一页 ]
[ :1.700478986e+09 ]
[
下一页 ]