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
1700479036
//作为被观察者,允许增加观察者,这里上级DNS一般只有一个
1700479037
1700479038
public void setUpperServer(DnsServer dnsServer){
1700479039
1700479040
//先清空,然后再增加
[
上一页 ]
[ :1.700478991e+09 ]
[
下一页 ]