package com.cheng.zenofdesignpatterns.patternpk.behavioral.observer_vs_chain.observer;
import java.util.Observable;
import java.util.Observer;
import java.util.Random;
/**
* 抽象DNS服务器
* 每个DNS服务器都即使观察者也是被观察者
*/
public abstract class ObserverDnsServer extends Observable implements Observer {
// 处理请求,也就是接收到事件后的处理
public void update(Observable arg0, Object arg1) {
Recorder recorder = (Recorder) arg1;
// 如果本机能解析
if (isLocal(recorder)) {
recorder.setIp(genIpAddress());
} else { // 本机不能解析,则提交到上级DNS
responsFromUpperServer(recorder);
}
// 签名
sign(recorder);
}
// 作为被观察者,允许增加观察者,DNS解析的上级DNS一般是一个
public void setUpperServer(ObserverDnsServer dnsServer) {
// 先清空,然后再增加
super.deleteObservers();
super.addObserver(dnsServer);
}
// 向父DNS请求解析,也就是通知观察者
private void responsFromUpperServer(Recorder recorder) {
super.setChanged();
super.notifyObservers(recorder);
}
// 每个DNS服务器签上自己的名字
protected abstract void sign(Recorder recorder);
// 每个DNS服务器都必须定义自己的处理级别
protected abstract boolean isLocal(Recorder recorder);
// 随机产生一个IP地址,工具类
private String genIpAddress() {
Random rand = new Random();
String address = rand.nextInt(255) + "." + rand.nextInt(255) + "." + rand.nextInt(255) + "." + rand.nextInt(255);
return address;
}
}