Java设计模式之责任链模式的示例详解
什么是责任链模式
责任链模式是一种行为型设计模式,设计思路是将一个请求同一个处理的对象组成一条链,当请求在链上不断传递并处理直到被处理完毕。责任链模式可以避免请求的直接发起者和接受者之间的耦合关系,同时使得请求可以被多个对象依次进行处理。
如何实现责任链模式
责任链模式包含两个重要的角色:抽象处理者和具体处理者。抽象处理者定义请求处理的方法,并且持有指向下一个处理者的引用;具体处理者实现具体的请求处理逻辑,同时需要持有指向下一个处理者的引用。
当请求到达责任链的起始点时,会由第一个处理者进行处理,如果无法处理则将请求转发给下一个处理者,直到请求被处理完毕或者请求没有被任何处理者处理。
示例一:处理用户注册信息
下面的示例展示了如何使用责任链模式处理用户注册信息。
首先定义一个抽象处理者AbstractHandler
:
public abstract class AbstractHandler {
protected AbstractHandler nextHandler;
public void setNextHandler(AbstractHandler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract boolean handle(User user);
}
其中nextHandler
指向下一个处理者,handle
方法是具体的请求处理方法。
然后定义两个具体处理者NameCheckHandler
和PhoneCheckHandler
分别用于检查用户名和手机号的合法性:
public class NameCheckHandler extends AbstractHandler {
@Override
public boolean handle(User user) {
if (user.getName() == null || user.getName().isEmpty()) {
System.out.println("用户名不能为空!");
return false;
}
if (nextHandler != null) {
return nextHandler.handle(user);
} else {
return true;
}
}
}
public class PhoneCheckHandler extends AbstractHandler {
@Override
public boolean handle(User user) {
if (user.getPhone() == null || user.getPhone().isEmpty()) {
System.out.println("手机号不能为空!");
return false;
}
if (nextHandler != null) {
return nextHandler.handle(user);
} else {
return true;
}
}
}
最后定义一个用户类User
:
public class User {
private String name;
private String phone;
public User(String name, String phone) {
this.name = name;
this.phone = phone;
}
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
}
使用上面的代码创建责任链并进行测试:
public class Test {
public static void main(String[] args) {
AbstractHandler nameCheckHandler = new NameCheckHandler();
AbstractHandler phoneCheckHandler = new PhoneCheckHandler();
nameCheckHandler.setNextHandler(phoneCheckHandler);
User user1 = new User(null, "12345678901");
User user2 = new User("", "12345678901");
User user3 = new User("张三", null);
User user4 = new User("张三", "123");
User user5 = new User("张三", "12345678901");
nameCheckHandler.handle(user1);
nameCheckHandler.handle(user2);
nameCheckHandler.handle(user3);
nameCheckHandler.handle(user4);
nameCheckHandler.handle(user5);
}
}
输出结果为:
用户名不能为空!
手机号不能为空!
手机号不能为空!
手机号不合法!
示例二:处理聚合支付
下面的示例展示了如何使用责任链模式处理聚合支付。
首先定义一个抽象处理者PayHandler
:
public abstract class PayHandler {
protected PayHandler nextHandler;
public void setNextHandler(PayHandler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract boolean pay(String orderId, double amount);
}
其中nextHandler
指向下一个处理者,pay
方法是具体的支付方法。
然后定义三个具体处理者AliPayHandler
、WechatPayHandler
和UnionPayHandler
分别用于处理不同的支付方式:
public class AliPayHandler extends PayHandler {
@Override
public boolean pay(String orderId, double amount) {
System.out.println("使用支付宝支付 " + amount + " 元!");
if (nextHandler != null) {
return nextHandler.pay(orderId, amount);
} else {
return true;
}
}
}
public class WechatPayHandler extends PayHandler {
@Override
public boolean pay(String orderId, double amount) {
System.out.println("使用微信支付 " + amount + " 元!");
if (nextHandler != null) {
return nextHandler.pay(orderId, amount);
} else {
return true;
}
}
}
public class UnionPayHandler extends PayHandler {
@Override
public boolean pay(String orderId, double amount) {
System.out.println("使用银联支付 " + amount + " 元!");
if (nextHandler != null) {
return nextHandler.pay(orderId, amount);
} else {
return true;
}
}
}
最后定义一个支付类Pay
:
public class Pay {
private PayHandler payHandler;
public Pay() {
PayHandler aliPayHandler = new AliPayHandler();
PayHandler wechatPayHandler = new WechatPayHandler();
PayHandler unionPayHandler = new UnionPayHandler();
aliPayHandler.setNextHandler(wechatPayHandler);
wechatPayHandler.setNextHandler(unionPayHandler);
this.payHandler = aliPayHandler;
}
public boolean pay(String orderId, double amount) {
return payHandler.pay(orderId, amount);
}
}
使用上面的代码创建支付对象并进行测试:
public class Test {
public static void main(String[] args) {
Pay pay = new Pay();
pay.pay("order_001", 100);
}
}
输出结果为:
使用支付宝支付 100.0 元!
使用微信支付 100.0 元!
使用银联支付 100.0 元!
总结
责任链模式可以有效地将请求的发起者和接受者解耦,同时也提高了系统的灵活性和可扩展性。在实际项目中,可以根据实际需求选择不同的责任链模式实现,以应对不同的情况和需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之责任链模式的示例详解 - Python技术站