背景:老大说这次写代码不要弄一堆判断,能用设计模式尽量用设计模式,我心想过滤器的责任链模式我还没研究明白呢,现在直接然我用,太复杂了,还是简单搞一搞吧,话不多说上代码
实现
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
* 轻量级责任链
*
*/
@Data
public class LightChainOfResponsibility<E> {
List<Supplier<E>> list;
Predicate<E> predicate;
public LightChainOfResponsibility() {
this(null);
}
public LightChainOfResponsibility(Predicate<E> predicate) {
this.predicate = predicate;
list = new ArrayList<>();
}
public LightChainOfResponsibility<E> add(Supplier<E> supplier) {
list.add(supplier);
return this;
}
/**
* @return 为null时表示通过测试,否则返回测试不通过的结果
*/
public E handle() {
for (Supplier<E> supplier : list) {
E e = supplier.get();
if (predicate != null && predicate.test(e)) {
return e;
}
}
return null;
}
public LightChainOfResponsibility<E> clear() {
list.clear();
return this;
}
}
调用
import com.zhin.daydayup.util.LightChainOfResponsibility;
import org.junit.Test;
public class LightChainOfResponsibilityTest {
@Test
public void test() {
LightChainOfResponsibility<Boolean> lightChainOfResponsibility = new LightChainOfResponsibility<>(e -> e);
System.out.println("帅锅今晚一共消费8888,要不办个卡");
System.out.println("不了直接刷");
lightChainOfResponsibility
.add(this::wechatPay)
.add(this::aliPay)
.add(this::ACBCPay)
.add(this::facePay);
if (lightChainOfResponsibility.handle()) {
System.out.println("老板慢走,欢迎下次光临");
} else {
System.out.println("没钱还想白嫖");
}
}
/**
* 微信支付
*/
public Boolean wechatPay() {
System.out.println("微信余额不足");
return false;
}
/**
* 支付宝支付
*/
public Boolean aliPay() {
System.out.println("支付宝余额不足");
return false;
}
/**
* 爱冲不冲支付
*/
public Boolean ACBCPay() {
System.out.println("爱冲不冲余额不足");
return false;
}
/**
* 颜值支付
*/
public Boolean facePay() {
System.out.println("颜值余额999,999,999.00");
return true;
}
}
这种实现灵活在能把各种方法实现当做判断内容添加进责任链里,使用起来比较简单方便,
当然肯定不如正式的责任链严谨规范,更算不上什么设计模式。
不得不说java 8的新特性不用时是抗拒的,用起来那是真的爽