顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
DNS解析:通常所知,DNS一般是先从本地查询,如果本地存在对应的ip地址,那么就返回记录,如果不存在,那么就向上一级发送请求。
Recorder:域名对应的记录;
DNSServer:一个抽象类,用于定义一些子类公共定义的方法;
SHDNSServer:上海地区域名解析;
ChinaDNSServer:中国地区域名解析;
RootDNSServer:根域名解析;
UML类图:
Recorder类:
package chain;
/**
* @Description:存储域名对应的相关信息
* @Author :小书包
* @CreateDate :2018-08-31 10:03
*/
public class Recorder {
//域名
private String domain;
//ip地址
private String ip;
//所属者
private String owner;
//省略set/get方法
@Override
public String toString() {
return "";//省略toString的实现
}
}
DnsServer 类:
package chain;
import java.util.Random;
/**
* @Description:DNS解析服务器
* @Author :小书包
* @CreateDate :2018-08-31 10:04
*/
public abstract class DnsServer {
//记录
protected Recorder recorder;
//上一级dns服务器
DnsServer upperDnsServer;
//设置上一级dns服务器
public void setUpperDnsServer(DnsServer upperDnsServer) {
this.upperDnsServer = upperDnsServer;
}
//是否为本地可解析的域名
abstract boolean isLocal(String domain);
//返回结果
abstract Recorder echo(String domain);
Recorder resolve(String domain) {
if (isLocal(domain)) {
recorder = echo(domain);
} else if (upperDnsServer != null) {// 如果本地不能处理,交给上一级进行处理
recorder = this.upperDnsServer.resolve(domain);
} else {
System.out.println("域名不存在,解析失败!");
return null;
}
return recorder;
}
}
SHDnsServer :上海地区域名解析服务器
/**
* 上海地区域名解析服务器
*/
class SHDnsServer extends DnsServer {
@Override
boolean isLocal(String domain) {
if (domain.endsWith("sh.cn.com")) {
return true;
}
return false;
}
@Override
Recorder echo(String domain) {
recorder = new Recorder();
recorder.setDomain(domain);
recorder.setOwner("上海市");
Random random = new Random();
recorder.setIp(random.nextInt(255) + "." + random.nextInt(255) + "." + random.nextInt(255) + "." + random.nextInt(255));
return recorder;
}
}
ChinaDnsServer:中国地区域名解析服务器
/**
* 中国地区域名解析服务器
*/
class ChinaDnsServer extends DnsServer {
@Override
boolean isLocal(String domain) {
if (domain.endsWith("cn.com")) {
return true;
}
return false;
}
@Override
Recorder echo(String domain) {
recorder = new Recorder();
recorder.setDomain(domain);
recorder.setOwner("中国");
Random random = new Random();
recorder.setIp(random.nextInt(255) + "." + random.nextInt(255) + "." + random.nextInt(255) + "." + random.nextInt(255));
return recorder;
}
}
RootDnsServer:根域名解析服务器
/**
* 全球域名解析服务器
*/
class RootDnsServer extends DnsServer {
@Override
boolean isLocal(String domain) {
if (domain.endsWith("com")) {
return true;
}
return false;
}
@Override
Recorder echo(String domain) {
recorder = new Recorder();
recorder.setDomain(domain);
recorder.setOwner("根域名");
Random random = new Random();
recorder.setIp(random.nextInt(255) + "." + random.nextInt(255) + "." + random.nextInt(255) + "." + random.nextInt(255));
return recorder;
}
}
Client测试类:
package chain;
/**
* @Description:
* @Author :小书包
* @CreateDate :2018-08-31 10:17
*/
public class Client {
public static void main(String[] args) {
DnsServer shServer = new SHDnsServer();
DnsServer chinaServer = new ChinaDnsServer();
DnsServer rootServer = new RootDnsServer();
//分别设置上一级解析
shServer.setUpperDnsServer(chinaServer);
chinaServer.setUpperDnsServer(rootServer);
String domain = "www.baidu.sh.cn.com";
Recorder recorder = shServer.resolve(domain);
System.out.println(recorder);
domain = "www.baidu.cn.com";
recorder = shServer.resolve(domain);
System.out.println(recorder);
domain = "www.baidu.com";
recorder = shServer.resolve(domain);
System.out.println(recorder);
domain = "www.baidu";
recorder = shServer.resolve(domain);
System.out.println(recorder);
}
}
输出结果:
Recorder{domain='www.baidu.sh.cn.com', ip='245.107.47.128', owner='上海市'}
Recorder{domain='www.baidu.cn.com', ip='60.131.88.110', owner='中国'}
Recorder{domain='www.baidu.com', ip='94.91.202.131', owner='根域名'}
域名不存在,解析失败!
null