设计模式之责任链模式

本文介绍了责任链模式,它为请求创建接收者对象链,能解耦请求发送者和接收者,属于行为型模式。若对象不能处理请求,会传给下一个接收者。还以DNS解析为例,说明了该模式的应用,包括各类域名解析服务器及UML类图等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顾名思义,责任链模式(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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值